Ich habe Golf gespielt diese Antwort von Rodrick Chapman .
Ohne Zweige: 74 Zeichen
int f(int i){return(-((i&1)<<1)|1)*i-(-((i>>>31)<<1)|1)*(((i|-i)>>31)&1);}
Mit Zweigen, im Java-Stil: 58 Zeichen
int f(int i){return i==0?0:(((i&1)==0?i:-i)+(i>0?-1:1));}
Mit Zweigen, C-Stil: 52 Zeichen
int f(int i){return i?(((i&1)?-i:i)+(i>0?-1:1)):0;}
Nach einem kurzen, aber aussagekräftigen Benchmark stellt sich heraus, dass die verzweigte Version auf meinem Rechner 33 % schneller ist. (Zufälliger Datensatz von positiven und negativen Zahlen, genügend Wiederholungen und verhindert, dass der Compiler den Code optimiert, mit Warmup). Das ist angesichts der Anzahl der Operationen in der unverzweigten Version und der möglichen guten Verzweigungsvorhersage aufgrund der Tatsache, dass die Funktion zweimal aufgerufen wird, nicht so überraschend: f(f(i))
. Wenn ich die Benchmark zu messen ändere: f(i)
ist die verzweigte Version nur 28 % schneller. Ich denke, das beweist, dass die Verzweigungsvorhersage im ersten Fall tatsächlich etwas gebracht hat. Ein weiterer Beweis: Beim Testen mit f(f(f(f(i))))
stellt sich heraus, dass die verzweigte Version 42 % schneller ist.
6 Stimmen
Um welche Stelle ging es bei diesem Vorstellungsgespräch?