2017-08-24 65 views
1

我正在用C++開發一個對延遲敏感的應用程序。有一個模塊在使用boost :: unordered_map。 在插入地圖的第一個條目時,我經歷了太多延遲,之後所有條目都有適當的插入時間。爲什麼Boost unordered_map在第一次插入時花費太多時間?

如果我使用std :: unordered_map而不是boost :: unordered_map,則不會發生此行爲。在這種情況下,第一次插入也需要幾百納秒(100〜200)。

這裏有一些時間統計,我注意到: - 在地圖第一插入:約12微秒(10〜12微秒) - 後,幾乎所有的插入:200納米秒(約)

下面是示例代碼示例:

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

你有問題嗎? – juanchopanza

+0

是否都插入到同一個存儲桶? –

+0

在創建地圖並在使用之前調用地圖上的'reserve(N)'方法。 –

回答

1

這是您的程序中的第一個堆分配。您的程序的其餘部分包含非常少量的堆分配。

第一次堆分配可能需要向操作系統請求一頁內存,該操作系統會重複使用,直到完成。這樣的請求可能需要比本地堆使用更長的時間。

這是一個理論。要確定究竟是花費時間,配置文件。

如果這個理論爲真,由於需要更多的操作系統頁面,以後的分配將花費更長的時間。仔細使用分配器和邊界映射大小可以使其不發生。

相關問題