2009-03-02 8 views
15

Ich verwende ziemlich viel STL in leistungskritischem C++ - Code unter Windows. Ein möglicher "billiger" Weg, etwas mehr Leistung zu bekommen, wäre der Wechsel zu einer schnelleren STL-Bibliothek.Wechsel von Microsofts STL zu STLport

Nach diesem post ist STLport schneller und benötigt weniger Speicher, aber es ist ein paar Jahre alt.

Hat jemand diese Änderung vor kurzem gemacht und was waren Ihre Ergebnisse?

Antwort

15

Ich habe die Leistung von STLPort zu MSCVC nicht verglichen, aber ich würde überrascht sein, wenn es einen signifikanten Unterschied gäbe. (Im Release-Modus natürlich - Debug-Builds sind wahrscheinlich sehr unterschiedlich.) Leider ist der Link, den Sie angegeben haben - und jeder andere Vergleich, den ich gesehen habe - zu wenig Details, um nützlich zu sein.

Bevor Sie sogar erwägen, Standardbibliotheksanbieter zu ändern, empfehle ich Ihnen, Ihren Code stark zu profilieren, um festzustellen, wo die Engpässe sind. Dies ist ein Standard-Ratschlag. Profilieren Sie immer, bevor Sie Leistungsverbesserungen versuchen!

Auch wenn Profiling Leistungsprobleme in Standard-Bibliothek Container oder Algorithmen zeigt, würde ich vorschlagen, analysieren Sie zuerst , wie Sie sie verwenden. Algorithmische Verbesserungen und eine angemessene Auswahl von Containern, insbesondere unter Berücksichtigung von Big-O-Kosten, sind weit mehr wahrscheinlich, um eine höhere Rendite zu erzielen.

+0

Kam hier mit dem gleichen Problem. Wenn man bedenkt, dass in VS2010 die Hash-Sets-Maps und alle anderen Dinge, die 2005-2007 aus TR1 eingeführt wurden, nicht existieren, kann der Unterschied zwischen O (1) und O (N) ... – ntg

0

Ich habe es nicht versucht, aber soweit ich weiß, gab es keine wesentlichen Änderungen an der Microsoft-STL-Implementierung. (Es gibt auch keine großen neuen Optimierungen im VS2008-Compiler über 2005). Wenn also STLPort schneller war, ist es wahrscheinlich immer noch der Fall.

Aber das ist nur Spekulation. :) Achten Sie darauf, über die Ergebnisse zu berichten, wenn Sie es ausprobieren.

-3

Ein Vorteil von STlport ist, dass es Open Source ist.

+0

wahr, aber nicht relevant für die Frage – 0xC0DEFACE

+16

Ich frage mich, wie Sie selbst – jalf

+2

eine Closed-Source-STL-Implementierung schaffen könnten so einfach wie nur nicht eine Open-Source-Lizenz zu den Header-Dateien hinzufügen. Denken Sie daran, Open Source bezieht sich auf die Lizenzierung, nicht ob Sie die Quelle lesen können oder nicht ... – Benj

5

In einem Projekt, das ich arbeitete, macht ziemlich viel Verwendung von STL, Umstellung auf STLport führte dazu, Dinge in der Hälfte der Zeit, die es mit Microsoft STL-Implementierung dauerte. Es ist kein Beweis, aber es ist ein gutes Zeichen für die Leistung, denke ich. Ich glaube, dass dies teilweise auf das fortschrittliche Speicherverwaltungssystem von STLport zurückzuführen ist.

Ich erinnere mich daran, einige Warnungen erhalten, wenn Sie diese Änderung vornehmen, aber nichts, was nicht schnell umgangen werden könnte. Als Nachteil würde ich hinzufügen, dass das Debuggen mit STLport mit dem Visual Studio-Debugger weniger einfach ist als mit der Microsoft-STL (Update: Es scheint, es gibt eine Möglichkeit, dem Debugger zu erklären, wie man mit STLport-Containern umgeht, danke!).

Die neueste Version geht zurück bis Oktober 2008, also arbeiten immer noch Leute daran. Siehe here zum Herunterladen.

+4

Über Debugging, ist das nicht nur eine Frage der Einrichtung der richtigen Visualizer für den Debugger? http://stlport.svn.sourceforge.net/viewvc/stlport/trunk/STLport/etc/autoexp.dat?revision=HEAD – jalf

+0

Nizza! Ich werde es versuchen! –

+1

Können Sie bitte Ihre "halbe Zeit" Quote quantifizieren? Habe ich recht, wenn ich annahm, dass Sie einen Release-Build verwenden? Was hast du gemacht? – MattyT

3

Wenn Sie den STLPort verwenden Sie eine Welt geben werden, wo jede STL-basierte Dritte Bibliothek Sie müssen verwenden als auch mit STLPort neu kompiliert werden, um Probleme zu vermeiden ...

STLPort hat eine andere Speicherstrategie , aber wenn dies Ihr Engpass ist, dann ändert Ihr Leistungssteigerungspfad den Zuordner (wechselt zum Beispiel zu Hoard) und ändert die STL nicht.

+0

stlport konfiguriert werden in Verbindung mit dem Stl verwendet werden. Es bedeutet nur, dass Sie bei der Verwendung bewusster sein müssen, anstatt nur ein Ersatz zu sein. – 0xC0DEFACE

9

Vergewissern Sie sich vor dem Umschalten, dass die MS-Bibliothek (Dinkumware) mit checked iterators deaktiviert ist.Aus irgendeinem seltsamen Grund sind sie sogar in Release-Builds standardmäßig aktiviert und das macht einen großen Unterschied, wenn es um die Leistung geht.

+0

Sehr guter Punkt, das macht einen großen Unterschied. Ich habe sie selbst deaktiviert, aber das könnte der Grund sein, dass es eine Beschleunigung in dem Blogeintrag gab, den ich in meinem Beitrag erwähnt habe. – Laserallan

6

Wir haben kürzlich die gegenteilige Aufgabe erledigt. Unsere Anwendung ist ein plattformübergreifendes C++ - Serverprogramm und basiert auf Windows mit VS 2008 (x86) und auf HP-UX ia64 und Linux mit gcc 4.3. Auf jeder Plattform haben wir den STLport 5.1.7 als STL-Bibliothek und Boost 1.38 verwendet.

Um die Leistung vor einiger Zeit zu vergleichen haben wir auch unsere Anwendung ohne STLport erstellt und danach die Leistung gemessen.

Danach unter Windows wurde die Leistung etwas besser. Daher entschieden wir uns, den STLport mit VS 2008 nicht mehr zu verwenden und die Standard-STL-Bibliothek von VS 2008 zu verwenden.

Auf HP-UX ia64 wurde die Leistung um 20% verringert. Caliper (der HP-UX-Profiler) zeigte, dass die Zuweisung von Strings mehr Zeit in Anspruch nahm. Und innerhalb der String-Zuweisung in der Standard-gcc-STL-Bibliothek gab es Aufrufe an pthread_mutex_unock. Soweit ich weiß, werden pthread_mutex_lock/pthread_mutex_unlock verwendet, da die Standard-gcc-STL-Bibliothek COW-Strings verwendet. In unserer Anwendung machen wir viele String-Zuweisungen und als Ergebnis der COW-Strings bekommen wir schlechtere Performance. Also verwenden wir STLPort immer noch auf HP-UX mit gcc.

5

Ich habe genau das Gegenteil getan vor einem Jahr und hier ist der Grund:

  • STLport sehr selten aktualisiert wird (soweit ich weiß, nur ein Entwickler arbeitet daran, Sie einen Blick auf nehmen ihr commit history)
  • Probleme beim Erstellen, wenn Sie zu neuen Visual Studio-Version wechseln. Sie warten auf die neue Make-Datei oder Sie erstellen sie selbst, aber manchmal können Sie sie aufgrund einiger Konfigurationsoptionen, die Sie verwenden, nicht erstellen. Dann wartest du darauf, dass sie es bauen.
  • Wenn Sie einen Fehlerbericht senden, warten Sie für immer, also im Grunde keine Unterstützung (vielleicht, wenn Sie zahlen). Am Ende reparierst du es selbst, wenn du weißt wie.
  • STL in Visual Studio hat checked iterators und debug iterator support das ist viel besser als das in StlPort. Hier kommt der größte Teil der Verlangsamung vor allem aus dem Debugging. Überprüfte Iteratoren werden sowohl im Debug- als auch im Release-Modus aktiviert. Dies ist nicht jedermanns Sache (Sie müssen sie selbst deaktivieren).
  • STL in SP1 Visual Studio 2008 kommt mit TR1 und Sie dies nicht in STLport
  • STL haben in Visual Studio 2010 rvalue Referenzen von C++ 0x verwendet und das ist, wo Sie einen echten Leistungsvorteil erhalten.