2017-08-24 4 views
1

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 ; 
} 
+0

Avez-vous une question? – juanchopanza

+0

Toutes les insertions sont-elles dans le même compartiment? –

+0

appelez la méthode 'reserve (N) 'sur la carte après l'avoir créée et avant de l'utiliser. –

Répondre

1

Cela a été la première allocation de tas dans votre programme. Le reste de votre programme consistait en une très petite quantité d'allocations de tas.

La première allocation de tas peut nécessiter de demander une page de mémoire à partir du système d'exploitation, qui est réutilisée jusqu'à ce qu'elle soit expirée. Une telle requête peut prendre plus de temps que l'utilisation locale du tas.

Ceci est une théorie. Pour déterminer exactement ce que prend le temps, profil.

Si cette théorie est vraie, les allocations ultérieures prendront plus de temps en raison de l'augmentation du nombre de pages de système d'exploitation. Et l'utilisation prudente d'un allocateur et de la taille de la carte englobante peut l'empêcher de se produire.