Ich wollte beweisen, dass C++ mit Move-Semantik ist viel schneller als Java und ich landete in einer großen Überraschung, dass es tatsächlich viel langsamer ist.C++ move Semantik-Performance im Vergleich zu Java
EDIT: Ich bin am Einfügen von Elementen in einem Vektor, obwohl ich weiß, dass solche Einfügung passt besser mit einer Liste. Dies ist jedoch ein typischer Benchmark für die Benchmark-Bewegungssemantik in C++. Daher wollte ich diesen speziellen Test nutzen, um die Unterschiede zu Java zu erkennen.
ich einen Fehler gemacht haben könnte getan: was habe ich die folgenden zwei Programme: http://melpon.org/wandbox/permlink/abZlAmZrOC9fJV8r und http://melpon.org/wandbox/permlink/3QGQMEIoF5kc3xtY
Das Ergebnis ist ziemlich überraschend, da es zeigt, dass Java schneller mit einem Faktor 6! soll ich den Code könnte auf verschiedenen Maschinen laufen, so habe ich versucht, auf meinem Rechner mit msvc 2012x64 und den folgenden Kompilierungsoptionen:
cl/EHsc/Ox cppPerf.cpp
Im Vergleich zu
jdk1.8.0_73 \ bin \ javac.exe javaPerf.java
Das Ergebnis geben ein Verhältnis von 10 in Bevorzugung für Java!
Wie könnte es sein, dass Java ist so viel schneller als C++, die weiterhin Bewegungssemantik verwendet?
Ein weiterer interessanter Punkt ist, dass Java7 mit Leistung gibt ziemlich weit von Java8 aber immer noch besser, dass C++:
EDIT: ich den Code entfernt, die durch die Links zugänglich ist.
EDIT:
Ich glaube, ich fand das Problem, optimierte Java einige Code entfernt. Diese sind Versionen aktualisiert, die zeigen, dass C++ ist viel schneller: http://melpon.org/wandbox/permlink/GsflztloK7ir2jea http://melpon.org/wandbox/permlink/CLwKoZzbfqstDOfn
EDIT: Dies ist ein weiterer Test, die Maßstäbe für C liefert ++ mit Referenzen wie @dasblinkenlight vorgeschlagen, die zeigen große Unterschiede zwischen C++ und Java (Anmerkung I Notiz nicht genutzt unique_ptr, weil ich gegen C++ 03 überprüfen will, und ich wollte Auftrieb vermeiden, damit keine scoped_ptr entweder): http://melpon.org/wandbox/permlink/bYQjNpjsIZu3vp3f
Ergebnisse sind:
C++14:
USE_MOVE USE_REFERENCES TIME
Y Y 30 to 55ms
N Y 30 to 60ms
Y N 370 to 210ms
N N 390 to 270ms (Implicit move of elements in vectors)
C++03:
USE_REFERENCES TIME
Y 45 to 70ms
N 1370 to 1650ms (No implicit move of elements in vectors)
Java:
11300 to 13000 ms
Sie ordnen die Zeichenfolgen mit dem Standardzuordner in C++ zu. Wenn ich mich recht erinnere, führen einige Java-Implementierungen standardmäßig eine Pooling nach Typ durch. Außerdem beugen Sie nur einen Zeiger im Java-Fall, aber Sie rufen den Destruktor jeder einzelnen Zeichenfolge im C++ - Fall auf (wenn "auto tmp" den Gültigkeitsbereich verlässt). Das C++ - Äquivalent zu dem, was Java tut, wäre 'std :: string & tmp = vec [i];' – PeterT
Ich habe es als EDIT geschrieben, aber tatsächlich ist der C++ - Code viel schneller, Java optimiert einige Code ... – JeanPhi
Gut mit dem geändert Code Sie Benchmark-String-Verkettung mehr als Sie Benchmarks "Move Semantik versus Referenzen" oder was auch immer Ihr ursprünglicher Punkt war. – PeterT