Benutzer mit den meisten Antworten
Performance der C++ Compiler 2012 vs 2013

Frage
-
Hallo,
mit neuer Hardware oder neuen VS-Versionen läßt man ja mal Progrämmchen laufen, um sich an der besseren Performanz zu ergötzen. Ich habe hier ein Programm, das durch einfache Teilung feststellt, ob eine bestimmte UINT64-Zahl eine Primzahl ist. Dabei werden immer die gleichen Variablen geteilt oder modulo genommen. Zwischen VC++ 2012 Express und VC++ der Community 2013 gibt es hier keine Unterschiede in der Ausführungsdauer.
Dann habe ich ein Programm, das prüft, ob Mersenne-Zahlen Primzahlen sind. Hier wird mit langen Arrays gearbeitet, viel multipliziert und gebitshiftet. Was nun mit VC++ 2012 Express kompiliert 01:27 min benötigte, braucht als VC++ CE 2013 01:30 bis 01:32 min, was 09:58 min lang dauerte, läuft nun 10:23 bis 10:43 min. Das ist ein Performanzverlust von 3 bis 7 %.
Die Projekte wurden durch VS automatisch auf die neue Version migriert. Die Compiler- und Linker-Parameter sind jeweils gleich.
So tragisch ist das zwar nicht, ist dennoch schade, daß mit neuer Version schlechtere Performanz verfügbar ist. Hat das schon jemand beobachtet?
Gruß
Heiko
Antworten
-
Welche Compiler Optionen verwendest Du ? GL und LTCG auch?
Wenn nicht mach das mal. Grundsätzlich habe ich solch eine Erfahrung noch nicht gemacht. Solange es um reinen C++ Code ging war der neue Compiler meistens schneller. Sobald aber CRT und std-Lib in das Spiel kam gab es immer wieder Unterschiede.
Hast Du ein minimales Sample?
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 13. Februar 2015 15:21
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 23. Februar 2015 09:16
Alle Antworten
-
Hallo,
ich habe mich bisher kaum mit dem Compiler Verhalten von C++ in verschiedenen VS Versionen beschäftigt. Ich kenne mich eher unter .NET und VS im allgemeinen aus.Solange alle Compiler Parameter gleich geblieben sind und sich der Compiler nicht bei den von dir verwendeten Funktionen geändert hat, sollte nach wie vor das selbe heraus kommen. Also entweder verschlechtert der Compiler an irgend einer Stelle deinen Code oder aber
der VS Debugger ist der Schuldige. Unter .NET sollte man Geschwindigkeitstests immer im Release-Modus ausführen, da dort der Debugger nicht weiter ins Gewicht fällt. Im Debug-Modus dagegen wird jede Anweisung minimal langsamer, was sich bei Schleifen und Arrays natürlich deutlich zeigt.
Da der Debugger in der Community Edition wahrscheinlich auch in C++ mehr Features hat, als in den Express-Versionen, wird er wahrscheinlich auch langsamer.So könnte ich mir das von dir beschriebene Verhalten zumindest erklären - aber wie gesagt, ich kenne mich nur minimal mit C++ usw. aus.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo,
ist dieser Performance-Verlust für dich in Ordnung, oder willst du ihn weg bekommen?
Wenn ja, dann kannst du mal einen anderen Compiler versuchen zu verwenden, abhängig davon, wie du deine Anwendung geschrieben hast, kannst du mal GNU Compiler verwenden.
Schau dir dazu mal das hier an: http://mingw.org/
ACHTUNG: Das funktioniert nur, wenn du Compilerunabhängige Standartfunktionen verwendet hast. Bei Compilerabhängigen Komponenten, müsstes du den Code ändern.
PS: Bist du sicher, dass kein Debugger o.ä. an deiner Anwendung hängt, oder das Sie irgendwie geblockt wird?
Du könntest mal den Code herzeigen, vielleicht ist dort eine Anweisung, die der Compiler nicht korrekt optimieren kann [was mitlerweile aber doch recht selten der Fall ist].
© 2015 Thomas Roskop
Germany // Deutschland
-
Hallo,
der Performance-Verlust ist nicht so tragisch, wollte nur mal erwähnen, daß es ihn gibt und er in bestimmten Fällen eben wiederholbar spürbar/messbar ist. Ich würde es natürlich besser finden, wenn die neuere Compiler-Version die performantere wäre.
Das mit Mingw lasse ich mal. Ich hatte mal Cygwin und dabei meine Schwierigkeiten, es wieder komplett deinstalliert zu bekommen.
Der Code ist leider relativ umfangreich mit einigen Klassen und Dateien (ist meine eigene Variante und nicht annähernd so performant wie die FFT-Implementationen zur Primzahlsuche). Es wäre ein bischen wie die Suche nach der Nadel im Heuhaufen.
Ich habe gerade mal die Compiler-Option Assemblyausgabe auf "Computercode und Quelle" gestellt. Mit dem TotalCommander kann man die generierten Assemblerdateien gut miteinander vergleichen. Es gibt zwar viele Unterschiede, aber die Anzahl der Codezeilen ist jeweils annähernd gleich. Den Code selbst verstehe ich jedoch nicht.
Gruß
Heiko- Bearbeitet Heiko65456465 Dienstag, 10. Februar 2015 19:12
-
Welche Compiler Optionen verwendest Du ? GL und LTCG auch?
Wenn nicht mach das mal. Grundsätzlich habe ich solch eine Erfahrung noch nicht gemacht. Solange es um reinen C++ Code ging war der neue Compiler meistens schneller. Sobald aber CRT und std-Lib in das Spiel kam gab es immer wieder Unterschiede.
Hast Du ein minimales Sample?
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 13. Februar 2015 15:21
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 23. Februar 2015 09:16
-
Hallo,
GL und LTCG werden verwendet. Ein minimales Sample habe ich nicht. Aber ich habe das Projekt in VS 2012 etwas abgespeckt, dann nach VS 2013 upgegradet und beide zusammen mit ein paar Infos und Logs gepackt auf OneDrive gestellt. Die Assembler-Dateien sind auch dabei. Wie erwähnt: es ist nur informativ. Ich habe nicht wirklich ein Problem damit, wen der Compiler in speziellen Situationen einwenig langsameren Code produziert.
Gruß
Heiko