2017-08-24 5 views
1

Ich entwickle eine latenzempfindliche Anwendung in C++. Es gibt ein Modul, in dem ich boost :: unordered_map verwende. Ich habe beim Eingeben des ersten Eintrags in die Map zu viel Latenz erlebt, danach haben alle Einträge eine annehmbare Einfügungszeit.Warum Boost unordered_map braucht beim ersten Einfügen zu viel Zeit?

Wenn ich std :: unordered_map anstelle von boost :: unordered_map verwenden, tritt dieses Verhalten nicht auf. In diesem Fall dauert die erste Insertion auch einige hundert Nanosekunden (100 ~ 200).

Hier sind einige Zeit-Statistiken, die ich bemerkt: - 1. Einfügung in der Karte: ca. 12 Mikro Sec (10 ~ 12 Mikro Sec) - Danach fast alle Einfügungen: 200 Nano Sec (ca.)

Hier ist der Beispielcode für die Abbildung:

struct timespec _timeSpec ; 

long getTimerTime() 
{ 
    clock_gettime(CLOCK_REALTIME, &_timeSpec); 
    return (1000000000 * _timeSpec.tv_sec) + _timeSpec.tv_nsec; 
} 

int main() 
{ 
    int i = 0; 

    boost::unordered_map < uint64_t , std::pair < uint64_t , bool > > _turnAroundTime ; 

    while(++i != 10) 
    { 
    uint64_t t1 = getTimerTime() ; 

    _turnAroundTime[i] = std::make_pair (i, true); 

    uint64_t t2 = getTimerTime() ; 

    std::cout << "Latency : " << t2 - t1 << std::endl; 
    } 

    return 0 ; 
} 
+0

Haben Sie eine Frage? – juanchopanza

+0

Sind alle Einfügungen in denselben Bucket? –

+0

rufen Sie die Methode 'reserve (N) 'auf der Karte auf, nachdem Sie sie erstellt haben und bevor Sie sie verwenden. –

Antwort

1

Das war die erste Heap-Zuweisung in Ihrem Programm. Der Rest Ihres Programms bestand aus einer sehr kleinen Menge von Heap-Allokationen.

Die erste Heap-Zuweisung erfordert möglicherweise eine Speicherseite vom Betriebssystem anzufordern, die bis zum Ausatmen wiederverwendet wird. Eine solche Anforderung kann länger dauern als die lokale Heap-Nutzung.

Dies ist eine Theorie. Um festzustellen, was genau Zeit braucht, Profil.

Wenn diese Theorie wahr ist, werden spätere Zuordnungen länger dauern, da mehr Betriebssystemseiten erforderlich sind. Und die sorgfältige Verwendung eines Zuordners und einer begrenzenden Kartengröße kann dazu führen, dass sie nicht auftritt.

Verwandte Themen