Je développe une application sensible à la latence en C++. Il y a un module où j'utilise boost :: unordered_map. J'ai subi trop de latence lors de l'insertion de la première entrée sur la carte, après quoi toutes les entrées ont un temps d'insertion correct.Pourquoi Boost unordered_map prend trop de temps lors de la première insertion?
Si j'utilise std :: unordered_map au lieu de boost :: unordered_map, ce comportement ne se produit pas. Dans ce cas, la première insertion prend également quelques centaines de nanosecondes (100 ~ 200).
Voici quelques statistiques en temps que je remarquai: - 1ère insertion sur la carte: environ 12 micro Sec (10 ~ 12 micro Sec) - Après que presque toutes les insertions: 200 nano Sec (environ)
Voici l'exemple de code pour illustration:
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 ;
}
Avez-vous une question? – juanchopanza
Toutes les insertions sont-elles dans le même compartiment? –
appelez la méthode 'reserve (N) 'sur la carte après l'avoir créée et avant de l'utiliser. –