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 ;
}
Haben Sie eine Frage? – juanchopanza
Sind alle Einfügungen in denselben Bucket? –
rufen Sie die Methode 'reserve (N) 'auf der Karte auf, nachdem Sie sie erstellt haben und bevor Sie sie verwenden. –