Warum ist '-1 * x' schneller als '-x' und warum?

8

Mit diesem Code:

%Vor%

Ich bekomme dieses Ergebnis wieder in ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux] :

%Vor%

Das sieht widersinnig aus, denn wenn ich rate, würde ich auf "-x" und nicht "-1 * x" setzen, um schneller zu sein.

Warum der Unterschied? Oder habe ich einen großen Fehler in meiner Messung?

    
Szymon Jeż 11.12.2015, 12:49
quelle

1 Antwort

12

Es könnte hilfreich sein, wenn Sie sich den generierten Bytecode ansehen. Wenn Sie es auf etwas Einfaches wie

reduzieren %Vor%

Sie können auch #~$ ruby --dump insns -e 'code' verwenden, um die Befehlssequenz zu drucken (wie von @Stefan ) erwähnt, die tatsächlich ausgegeben wird eine viel sauberere Ausgabe.

%Vor%

Sie werden in der Bytecode-Auflistung feststellen, dass in -1 * a Ruby ein opt_mult ist, was im Grunde nur eine arithmetische Operation ist und intern optimiert ist. Auf der anderen Seite ist das -a -Bit ein opt_send_without_block , was ein tatsächlicher Methodenaufruf ist. Meine Vermutung ist, dass die zweite Version (ein bisschen) langsamer ist.

    
eugen 11.12.2015, 13:19
quelle

Tags und Links