2009-10-22 10 views
9

Versuchen Sie zu sehen, welche Besetzung schneller ist (nicht notwendig, besser): neue C++ - Fall oder alte Mode C-Stil zu werfen. Irgendwelche Ideen?welche Besetzung ist schneller static_cast <int>() oder int()

+1

könnten Sie immer ein Benchmark-Skript schreiben. Mach einfach 10 Millionen Static_cast und 10 Millionen Int Cast, und schau, welche länger dauert. my * rate * ist, dass sie zu derselben Assembleranweisung kompilieren werden. – Kip

+12

Ungeachtet der Tatsache, dass sie fast sicher auf allen Compilern das gleiche kompilieren, warum sollte das wichtig sein? Sofern Sie keine Leistungsprobleme haben, schreiben Sie, um klar zu sein und schwer zu lesende Mikrooptimierungen zu vermeiden, die ohnehin wahrscheinlich sinnlos sind. Verwenden Sie static_cast (). –

+3

C-Style-Casts werden in C++ - Style-Casts definiert (und c-Style-Casts können an private Basen übertragen werden ...). Sie sind also ziemlich gleichwertig. niemand hat einen Leistungsschub gegenüber dem anderen. –

Antwort

33

Es sollte keinen Unterschied geben, wenn Sie int() mit gleichwertige Funktionalität von static_cast<int>() vergleichen.

Mit VC2008:

double d = 10.5; 
013A13EE fld   qword ptr [[email protected] (13A5840h)] 
013A13F4 fstp  qword ptr [d] 
    int x = int(d); 
013A13F7 fld   qword ptr [d] 
013A13FA call  @ILT+215(__ftol2_sse) (13A10DCh) 
013A13FF mov   dword ptr [x],eax 
    int y = static_cast<int>(d); 
013A1402 fld   qword ptr [d] 
013A1405 call  @ILT+215(__ftol2_sse) (13A10DCh) 
013A140A mov   dword ptr [y],eax 

Offensichtlich ist es 100% die gleichen!

+8

+1. Die Montage ist immer schön für solche Dinge. – Joey

+0

Das sieht nicht sexy für mich aus :) Ein sexy würde SSE-Anweisungen verwenden, ohne die FPU überhaupt zu beteiligen :) (Ich dachte, dass SSE standardmäßig in VC verwendet wurde). – AnT

+0

@AndreyT Es tut :) der Code in der Antwort wurde im Debugging-Modus erzeugt. Wenn Sie versuchen, es mit Optimierungen zu kompilieren, verwendet es SSE-Anweisungen. – AraK

2

Werfen Sie einen Blick auf die Baugruppe mit jeder Methode. Wenn es anders ist, benutze einen Profiler.

1

Sie sind die gleichen wie es während der Kompilierzeit selbst aufgelöst wird und es keinen Laufzeitaufwand gibt. Selbst wenn es einen Unterschied gäbe, würde ich mich nicht wirklich um diese winzigen (nicht einmal Mikro-) Optimierungen kümmern.

3

Kein Unterschied überhaupt.

Wenn es sich um solche grundlegenden Konstrukte wie eine einzige Besetzung handelt, werden zwei Konstrukte, wenn sie dieselbe semantische Bedeutung haben, vollkommen identisch sein, und der für diese Konstrukte generierte Maschinencode wird derselbe sein.

-2

Wenn Sie aus der Wahl nur einen kleinen Unterschied machen, wähle ich den, der späterem Programmierer vertrauter erscheint. Es ist immer eine Überlegung wert, anderen Code leichter verständlich zu machen. In diesem Fall würde ich aus diesem Grund int(…) bleiben.

+0

Warum würden Sie annehmen, dass int (...) vertrauter ist? Es scheint tatsächlich in C nicht gültig zu sein, vielleicht eher ein Pseudo-Konstruktor-Aufruf von C++. - Warum sollte Code, wenn er nicht explizit über die Art der Besetzung spricht, den Code leichter verständlich machen? – UncleBens

+0

Darsteller sind nichts zu spielen und sollten deshalb leicht zu erkennen sein. Das ist, was die C++ - Style-Casts sind. – foraidt

3

Ich glaube, dass das tatsächliche Ergebnis Implementierung definiert ist. Sie sollten es in Ihrer Version des Compilers überprüfen. Aber ich glaube, dass es das gleiche Ergebnis in den meisten modernen Compilern geben wird. Und in C++ sollten Sie nicht C-Cast verwenden, sondern stattdessen C++ casts verwenden - damit können Sie Fehler bei der Kompilierung finden.

+0

+1 für die Erwähnung von Kompilierzeitprüfungen – foraidt

+0

Leistungsprobleme sind nicht implementierungsdefiniert (der Standard schreibt keinerlei Leistung vor, mit Ausnahme von "big-O" für Containeroperationen) –

0

Da die meisten Leute sagen, man hofft, dass diese die gleiche Geschwindigkeit sein sollten, obwohl Sie Ihrem Compiler ausgeliefert sind ... und das ist nicht immer eine sehr glückliche Situation. Lesen Sie weiter für Kriegsgeschichten.

Abhängig von Ihrem Compiler und dem jeweiligen Modell des Prozessorkernes, die das Programm auf der Geschwindigkeit führt von float f; int i(f);, float f; int i = (int)f; und float f; int i = static_cast<int>(f); und Konsorten (einschließlich Variationen beteiligt Doppel, lange und unsigned-Typen) kann atrociously langsam sein - ein Auftrag von Magnitude schlimmer als Sie erwarten. Der Compiler kann Anweisungen ausgeben, die die internen Prozessormodi verändern, wodurch Anweisungspipelines weggeworfen werden. Dies ist in der Tat ein Fehler im Optimierungselement des Compilers. Ich habe Fälle gesehen, in denen man unter den in this analysis erwähnten 40-Taktzyklus-Kosten leidet. An diesem Punkt gibt es einen großen, unerwarteten und irritierenden Leistungsengpass. Bei AFAIK gibt es keine ganz angenehme, robuste, generische Lösung. Es gibt Alternativen mit Assembler, aber mit AFAIK runden sie Fließkommazahlen nicht auf ganzzahlige Weise ab, wie es bei den Umwandlungen der Fall ist. Wenn jemand es besser weiß, bin ich interessiert. Ich hoffe, dieses Problem wird/wird in Kürze auf Legacy-Compiler/Hardware beschränkt sein, aber Sie brauchen Ihren Verstand über Sie.

P.S. Ich kann diesen Link nicht erreichen, weil meine Firewall es als spielbezogen blockiert, aber a Google cache of it ausreicht, um zu zeigen, dass der Autor mehr darüber weiß als ich.

Verwandte Themen