std::map und performance, schneidende Sätze

Ich bin kreuzenden einige Sätze von zahlen, und tun dies durch das speichern einer Anzahl von jedes mal, wenn ich eine Zahl sehen, die in einer Karte.

Ich finde die Leistung sehr langsam.

Details:
- Eines der sets hat 150.000 zahlen
- Der Schnittpunkt der dass-Satz und ein weiterer Satz dauert etwa 300ms ersten mal, und über 5000ms zweiten mal
- Ich habe nicht getan, alle Profilerstellung noch, aber jedes mal, wenn ich Pause den debugger während der Kreuzung seine in malloc.c!

So, wie kann ich diese verbessern die Leistung? Schalten Sie auf eine andere Datenstruktur? Einige, wie die Verbesserung der Zuweisung von Speicher-performance der map?

Update:

  1. Gibt es eine Möglichkeit, zu Fragen, std::map oder
    boost::unordered_map zu pre-allocate
    etwas Platz?
  2. Oder gibt es irgendwelche Tipps, wie Sie mit diesen effizient?

Update2:

Sehen Schnelle C++ - container wie die C# HashSet<T> und Dictionary<K V>?

Update3:

Ich ein Benchmark set_intersection und bekam schreckliche Ergebnisse:

(set_intersection) Found 313 values in the intersection, in 11345ms
(set_intersection) Found 309 values in the intersection, in 12332ms

Code:

int runIntersectionTestAlgo()
{   

    set<int> set1;
    set<int> set2;
    set<int> intersection;


    //Create 100,000 values for set1
    for ( int i = 0; i < 100000; i++ )
    {
        int value = 1000000000 + i;
        set1.insert(value);
    }

    //Create 1,000 values for set2
    for ( int i = 0; i < 1000; i++ )
    {
        int random = rand() % 200000 + 1;
        random *= 10;

        int value = 1000000000 + random;
        set2.insert(value);
    }

    set_intersection(set1.begin(),set1.end(), set2.begin(), set2.end(), inserter(intersection, intersection.end()));

    return intersection.size(); 
}
  • Ich empfehle Sie profile erstellen, um mehr Informationen sammeln. Wenn Sie die große Datenstrukturen, die malloc-Sache ist eine Möglichkeit.
  • Wenn ich kommentieren die Einsätze und suchen in der Karte und drehen Sie einfach durch meine sets geht die Zeit Weg nach unten. 90% der Zeit damit verbracht wird, in der Karte. Ich habe versucht, schalten auf boost::unordered_map, Gleiches Ergebnis.
  • HI Alex, also, was war deine Finale version ? Immer noch mit std::set ? Oder eine sortierte Vektor ? [Interesse] Danke.
InformationsquelleAutor Alex Black | 2009-06-29
Schreibe einen Kommentar