2015-08-10 4 views
5

Wenn mir jemand helfen könnte, bin ich völlig aus Ideen.Karte Leistung Ausgabe

So habe ich diesen Code (es ist eine sehr vereinfachte Version meines Code):

while(readNewFile()) 
{ 
    while(getNewStructFromFile()) 
    { 
     unsigned long starttime = GetTickCount(); 
     customerData.fillFromBinaryData(structPointer); 
     cout<< GetTickCount() - starttime; 

     aMap.insert(pair<int,string>(customerData.phoneNumber,"")); 
    } 

    // Ouptut all data 

    aMap.clear(); 
} 

Im Grunde ist es liest nur Datensätze aus einer Binärdatei. bekommen die Daten und füllt ihre Variablen mit Daten aus. Dann fügt es die Telefonnummer in eine Karte ein (zum Debuggen füge ich nur eine int und eine leere Zeichenfolge ein).

Das Problem ist, dass dieses Programm nach kurzer Zeit sehr langsam wird; Wenn ich die Karte ausfüge, fügt das Programm OK ohne Probleme mit einer konstanten Ausführungszeit pro Datei ein. Wenn ich die Map-Einfügung benutze, geht das Programm nach einigen Dateien wieder sehr langsam (von 8 - 10 Sekunden auf 1 Minute oder mehr). Aber Debugging mit GetTickCount(), zeigt es mir, dass die Verzögerung in customerData.fillFromBinaryData passiert (zuerst 0ms, und dann springt es auf 30-40 ms (zum Ausfüllen der Klassenvariablen)). Aber wenn ich diese einfache Karteneinfügung kommentiere, gibt es keine Verzögerung beim Füllen des Objekts mit Daten! Wo ist die Logik darin? Könnte mir jemand einen Hinweis geben, ich habe keine Ideen mehr. Entschuldigung, wenn diese Frage nicht wirklich gut ist.

Ich habe verschiedene Arten von Karten ausprobiert, aber wieder zeigt es mir, dass die Verzögerung nicht in der Karteneinfügung ist.

Bearbeiten/Mögliche Lösung:

Falls jemand hat ähnliche Probleme, ich installiert VS2015 und die Verzögerungs Karten verwenden ist weg! Ich bin mir nicht sicher, wie das zusammenhängt, aber Hurra!

+2

Sie drucken alle Daten in jeder Schleife? Die Daten werden jedes Mal größer .... – Aleksandar

+1

Ich kann einfach nicht die einzige Person sein, die aus der Ferne neugierig ist, warum diese Frage mit "asn.1" markiert ist, wenn man bedenkt, dass sie im Fragetext überhaupt nicht erwähnt wird. – WhozCraig

+0

Ich gebe einmal pro Datei aus, und ich lösche die Karte danach, warum würde es größer werden? customerData ist nur ein Kundendatensatz, jedes Mal wenn es einen neuen Wert erhält. Ich lese wirklich von einer asn Akte :) Ich bin nicht sicher, warum ich den Umbau ... hinzufügte – Silencer

Antwort

1

Es kann passieren, dass, wenn eine Karte sehr groß wird, Sie ein Problem mit der Speicherverwaltung haben und fillFromBinaryData erfordert einige Speicherzuweisung, die jetzt langsamer ist. Wegen einer Speicherfragmentierung vielleicht?

Ich würde vorschlagen, einige Bibliotheken für diesen speziellen Zweck zu versuchen. Allerdings habe ich vergessen, wie sie heißen. Ich weiß nur, dass es einen von Google gibt, "jemalloc" oder etwas Ähnliches.

Der Hauptpunkt eines benutzerdefinierten Speicherpools besteht darin, dass Sie Speicher einmal als großen Haufen zuweisen und ihn nur in einem Bereich Ihrer App mit benutzerdefinierten Zuordnern verwenden können.

Eine weitere Sache ist vielleicht zu stoppen, um eine Karte zu verwenden und stattdessen die ungeordnete Karte zu verwenden. Ändern Sie die Zeit Komplexität für die Einfügung von O (logn) zu O (1) mit einer perfekten Hash-Funktion, da für Sie eine Telefonnummer ist.

  • Es heißt Jemalloc und es ist nicht von Google. :)
+0

Nun die ersten paar Dateien die Karte geht in Ordnung, wie kann das erklärt werden? Ich rufe clear() nach jeder Datei, so dass die Karte sollte wieder von 0 beginnen, es ist nicht wie es immer noch wächst? Und ich verwende ungeordnete Karte und Reserve 4000 Elemente, a Datei hat ca. 3500 Datensätze – Silencer

+2

Dann könnte es ein Fragmentierungsproblem sein Überprüfen Sie, was jemalloc tut.Andernfalls weiß ich nicht, was es sein könnte.Ich würde vorschlagen, dann Ihre App mit Valgrind --Tool = Callgrind oder etwas ähnliches zu starten. – AlexTheo