Begrenzen Sie die Anzahl der std :: string Zuordnungen

8

Ich habe eine Funktion, die ein std::string von einem const char* mit zwei Zahlen erstellt, die als Parameter übergeben werden und an das Ende angehängt werden.

%Vor%

Diese Funktion wird tausende Male aufgerufen, um eindeutige Namen für kleine Objekte zu erstellen, die auf dem Heap zugeordnet sind.

%Vor%

Ich habe entdeckt, dass das Valgrind-Massif-Tool verwendet wurde, dass die Aufrufe von makeName viel Speicher zuweisen, da es so oft aufgerufen wird.

%Vor%

Meine Frage ist, wie kann ich diese Zuweisungen minimieren, um die Gesamtmenge an Speicher zu reduzieren, die mein Programm verwendet?

BEARBEITEN: Ich möchte auch darauf hinweisen, dass ich als Programmvoraussetzung keine C ++ 11-Funktionen verwenden kann.

    
packersfan16 05.02.2015, 15:13
quelle

3 Antworten

3

Nur eine DIY-benutzerdefinierte Umwandlung schlägt in diesem Fall sprintf .

Also würde ich sprintf und MEASURE verwenden.

Nur wenn das nicht gut genug wäre, würde ich meine eigene Ganzzahl-zu-Zeichenfolge implementieren (aus zahlreichen Fällen wissend, dass es sicherlich etwas schneller sein wird, aber nicht genug, um damit zu beginnen).

Beispiel. Anstelle des aktuellen High-Level-Codes

%Vor%

tu es einfach

%Vor%

Haftungsausschluss: Der Code wurde nicht von den Händen des Compilers berührt.

    
Cheers and hth. - Alf 05.02.2015, 15:31
quelle
2

"Meine Frage ist, wie kann ich diese Zuweisungen minimieren"

Es kommt mir vor, dass Sie einen Grund für diese Namen haben. Können Sie sie zum Zeitpunkt des Bedarfs berechnen, anstatt immer den Namen im Konstruktor zu generieren? Das wäre die beste Verbesserung - tue es erst, wenn es nötig ist.

Wenn Sie bereits eine virtuelle Basis haben und der Klassentyp die Zeichenkette bestimmt, ist das wirklich einfach. Andernfalls könnte ein Aufzählungstyp die Zeichenfolge ersetzen und Sie verfügen über eine Nachschlagetabelle.

%Vor%

Wenn das nicht hilft, brauchen Sie tatsächlich die Zeichenfolge für jedes Objekt, und Sie können nur eine kleine Beschleunigung erhalten, indem Sie diese Funktion optimieren. Ich habe bemerkt, dass du die Saite in einer Größe konstruierst, um sie danach zu wachsen. Sie könnten auch mit einem Zeichenpuffer arbeiten und ihn dann der Member-Zeichenfolge (im Konstruktor) zuweisen.

    
Kenny Ostrom 05.02.2015 15:34
quelle
1

Ja, Ihr Code macht viele Zuweisungen. Analyse der Zuordnungen:

%Vor%

'möglicherweise', weil es von den Zeichen abhängt, die von den Zahlen benötigt werden (je höher, desto mehr).

Wenn Sie wirklich an Speicherzuweisungen interessiert sind, ist wahrscheinlich asprintf (nicht Standard) oder Ihre Version (basierend auf dem Rückgabewert von s(n)printf ) die beste Wahl:

%Vor%

Hinweis : Wie @ Cheersandthth.-Alf darauf hingewiesen hat, für den Fall, dass std::string keinen Speicher zugewiesen hat, ptr wäre ptr ist ausgelaufen. Der beste Weg, dies zu lösen, wäre die Verwendung von std::unique_ptr , aber ich überlasse es Ihnen, es Ihren Bedürfnissen anzupassen.

Wenn Sie asprintf nicht verwenden möchten, können Sie ein ähnliches Verhalten mit std::snprintf

erzielen %Vor%

Der Unterschied zu Ihrer Version (ich habe boost::lexical_cast aber std::to_string nicht verwendet) ist sehr groß: 500 Mal lief die erste Version 72.890 Byte, während die zweite nur 23.890 Byte hatte! (gemessen mit valgrind memcheck)

    
edmz 05.02.2015 15:47
quelle

Tags und Links