Frage

Ich arbeite an einer sehr großen Maßstab Computing-Bibliothek, die STL stark verwendet. Die Bibliothek wird mit MSVC2003 gebaut, und es wird seine STL-Implementierung verwendet wird. Ich bin auf der Suche nach einer Alternativen STL-Implementierung, die die Bibliothek senkt ihre Speicheranforderungen helfen würde, und seine Leistung erhöhen.

Es ist nicht möglich, für den Moment auf eine neuere Version von MSVC zu wechseln.

würde ich ein Feedback auf realer Welt Nutzung nicht wie auf Basis von Benchmarks, wenn möglich.

EDIT: Um es ein wenig klarer, zum Beispiel einig STL-Implementierung (wie STLSoft) schlägt spezifische Optimierungen für String-Verkettung; Diese könnten klingt klein Auswirkungen, aber sie können zu großen Verbesserungen führen. STLPort ist ein weiteres gutes Beispiel, in dem sie ihr Ziel klar sagen: die schnellste STL-Implementierung mit der Umgebung gibt es die stdlib ++, etc ... alle diese gute Kandidaten sein können, aber ich habe keine Zeit, sie alle zu testen, ich erfordern einige Community-Hilfe auf das.

War es hilfreich?

Lösung

STLPort . Haben Sie nicht die Speichernutzung Unterschiede gemessen, aber es ist auf jeden Fall schneller (ja, reale Welt Nutzung).

Andere Tipps

Ich frage Ihre grundlegende Prämisse, dass Sie nicht auf eine neuere Version von MSVC wechseln.

Ich glaube nicht, Sie niedrigere Speicher und erhöhte Leistung „kostenlos“ zu bekommen sind durch eine neue STL herunterzuladen. Oder zumindest, wenn Sie getan haben, würden Sie wahrscheinlich so viele Code-Fixes zu tun, als ob Sie gerade waren zu aktualisieren, um die neuesten MSVC.

Langfristig gibt es keine Frage, die Sie aktualisieren möchten ... Tun Sie es jetzt, und Sie Macht Glück haben und einen Teil dieser Speicher und Performance kostenlos.

Das einzige, was ich denken kann, entlang der Linien von Ihnen vorschlagen, was Sie sagen, Sie suchen würde, um den Intel-Compiler zu versuchen, die ich beide gut hatte (Performance!) Und schlecht (schrullig, manchmal !) Erfahrung mit.

Other than that, finden Sie Ihre eigenen Speicher und Performance-Probleme und benutzerdefinierte Container und Algorithmen schreiben. STL ist genial, aber es ist kein Allheilmittel für die Befestigung aller Probleme in allen Fällen. Domain Wissen ist Ihr bester Verbündeter.

Haben Sie darüber nachgedacht, Ihr eigenes Speicherzuordner zu schreiben? Sie müssen nicht immer die gesamte STL wechseln, wenn Sie die Speicherzuweisung Strategie einfach nicht mögen. Alle Behälter einen Ersatz allocator nehmen.

Haben Profil Sie Ihren Code und als kleine Veränderungen an den Bereichen, die das Problem sind? Ich würde denken, wäre es viel weniger schmerzhaft sein als das, was Sie in Betracht ziehen.

Die meisten davon hängt davon ab, welcher Behälter Sie sprechen, und wie Sie es verwenden. Vektor in der Regel den geringsten Platzbedarf, außer im Moment Sie ein Element hinzufügen, die über den Stromvektor Kapazität ist. In diesem Augenblick wird es es so etwas wie 1,5 x die Stromvektoren Kapazität, verschieben Sie die Elemente (oder im schlimmsten Fall macht eine neue Kopie, die auch Speicher reserviert) zuweisen und wenn dies geschehen ist, löschen Sie die alten Vektoren Interna, wenn Sie wissen, wie viele Elemente es geht zu halten vorne, Vektor mit einem Einsatz von Reserve ist die beste Wahl.

Die zweite kleinste Liste. Es hat den Vorteil, dass es nicht eine temporäre Kopie von sich selbst gehen zu machen. Danach Satz ist Ihre beste Wette wird wahrscheinlich eingestellt. Einige Implementierung haben slist jetzt, was kleiner ist. In diesen Fällen ist tt ziemlich einfach, eine allocator zu machen, die die Speicher in Seiten packen. Bleiben Sie weg von Speicherfresser wie unordered_ *

Auf MSVC sicher sein, #define _SECURE_SCL = 0 Dies erfordert viel Aufwand für sichere Programmierung überprüft (wie Pufferüberläufe, etc.) verwendet out

Bei weitem die meisten Speicher effiziente Container sind boost / intrusive Diese extrem kleine Fußabdrücke haben, da sie die Erinnerung an die Sache verwenden enthalten ist. So instread die für einen kleinen Teil des Speichers für eine verknüpfte Liste oder rb Baumknoten auf den Heap geht, sind die Knoten Zeiger Teil des Objekts selbst. Dann wird der „Behälter“ ist nur ein Rohmaterial Set von wenigen Zeiger einen Wurzelknoten zu bilden. Ich habe es schon einige Male verwendet der Platzbedarf und Zuordnung Kopf loszuwerden.

Die meisten STL-Implementierungen, darunter auch die von MSVC2003, sind gut generische Bibliotheken implementiert. So werden Sie nicht eine signifikante Leistungsverbesserung von einer Implementierung zur anderen sehen.

Aber manchmal kann man Algorithmus (oder Container) schreiben, die schneller sind als die STL für Sie, weil Sie etwas über Ihre Daten wissen, dass der STL Schriftsteller nicht neu war (da sie generische Container und Algorithmus geschrieben haben).

Zum Schluss, wenn Sie Ihre Anwendungen Leistungen zu verbessern, versuchen Sie besser Spezialcontainer zu erstellen, die Sie Daten speziell passen als für eine leistungsfähigere STL suchen.

Wenn die Leistung Ihrer Anwendung so kritisch ist, und STL hinein verwoben ist es möglich, eine Open-Source-Implementierung (wie STL-Port-, wie bereits erwähnt) und es für sich selbst berappen, Verbesserungen machen Leistung je nach Bedarf?

Auf der einen Seite kann ich sehe dies ein rutschiger Abhang immer, wo Sie Nicht-Standard-Änderungen an der Gabel der STL-Bibliothek zu machen, damit Probleme zu schaffen. Allerdings Bedeutung der Leistung Ihrer Anwendung könnte das Risiko, dass dies geschieht aufwiegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top