Problem: Visual Studio 2010 Compiler vs G++
-
Einen wunderschönen Nachmittag wünsche ich.
Ich hab da ein Problem, dass ich nicht ganz verstehe:
Ich habe mit dem g++ einen Algorithmus realisiert, der ausschließlich mit Standard C++ und der Mathebibliothek Newmat arbeitet (http://www.robertnz.net/nm11.htm).
Newmat ist eine Sammlung von cpp und Headerdateien. Damit ich nicht ständig Newmat mitkompilieren muss, hab ich mir eine statische Bibliothek erstellt, die ich im Projekt einbinde.Die newmat.a auf Release kompiliert ist ~1.9MB groß. Die newmatd.a ist ~5.2MB groß. Der Algorithmus braucht (mit boost-Timer gemessen) bei g++ auf Debug kompiliert ~10ms, auf Release ~5ms.
Jetzt hab ich das Projekt mit Visual Studio 2010 kompiliert. Auch hier habe ich vorher eine statische Newmat-Lib erstellt.
Jetzt wird es interessant:
Die newmatd.lib ist 9.534MB groß, die newmat.lib (also Release) ist 30.173MB groß
. Das Laufzeitverhalten ist insgesamt deutlich schlechter:
Der Algorithmus braucht auf Debug kompiliert ~68ms, auf Release ~10ms.Der mit dem Visual Studio 2010 kompilierte Code ist somit auf Release gerade mal so schnell, wie der vom g++ generierte Debug-Code. An den Optimierungen hab ich nirgendwo was geändert.
Kann das an der statischen Newmat-Bibliothek liegen? Vor allem die knapp 30MB für die vom VStudio generierte Releaseversion machen mich stutzig. Ich kann mir das insgesamt nicht erklären, vielleicht hat hier ja jemand eine idee

-
ad Laufzeit:
Visual C++ hat auch im Releasemodus noch einige Checks in der Standardbibliothek aktiviert. Diese kannst du mit _SECURE_SCL=0 abschalten (natürlich sowohl beim Erstellen von newmat als auch beim Erstellen Deines Projekts).ad Größe:
Im Releasemodus ist beim Visual C++ glaube ich defaultmässig Link Time Code Generation aktiviert. Das ermöglicht aggressives Inlining beim Binden selbst mit externen Bibliotheken (sofern diese auch mit LTCG erstellt wurden), da nicht nur der Objektcode, sondern auch der AST vom Compiler in der Bibliothek gespeichert wird.
-
LordJaxom schrieb:
ad Laufzeit:
Visual C++ hat auch im Releasemodus noch einige Checks in der Standardbibliothek aktiviert. Diese kannst du mit _SECURE_SCL=0 abschalten (natürlich sowohl beim Erstellen von newmat als auch beim Erstellen Deines Projekts).Mittlerweile ist _SECURE_SCL=0 zum Glück default für release. Was sie sich früher dabei gedacht hatten, es anders zu machen, ist mir bis jetzt ein Rätsel geblieben.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.