[英]c++ vector performance non intuitive result?
我對VS2010中的性能向導不滿意,該向導用於測試檢測(函數調用計數和計時)。
在學習了C ++ STL中的向量之后,我才決定看看我能獲得關於用一百萬個整數填充向量的性能的哪些信息:
#include <iostream>
#include <vector>
void generate_ints();
int main() {
generate_ints();
return 0;
}
void generate_ints() {
typedef std::vector<int> Generator;
typedef std::vector<int>::iterator iter;
typedef std::vector<int>::size_type size;
Generator generator;
for (size i = 0; i != 1000000; ++i) {
generator.push_back(i);
}
}
我得到的是:上面的經過時間為2402.37毫秒。 但是我了解到,向量在內存不足時必須重新調整自身大小,因為它們在內存中是連續的。 因此,我認為通過對上述內容進行補充可以得到更好的性能:
generate.reserve(1000000);
但是,這會使程序的執行時間增加一倍,達到大約5000毫秒。 這是函數調用的屏幕截圖,左側沒有上面的代碼行,右側沒有。 我真的不明白這個結果,而且鑒於我了解到如何定義矢量容量(如果您知道會用噸填充)的定義,這對我來說是沒有意義的。 指定儲備基本上使大多數函數調用加倍。
從您發布的屏幕快照來看,您似乎是在沒有優化的情況下進行編譯,這會使您執行的所有基准測試無效。
您可以在關注性能時進行基准測試,而在關注性能時,可以按編譯器上的“快速運行”按鈕,並啟用優化。
告訴編譯器變慢,然后擔心它的速度比預期的慢是沒有意義的。 我不確定插入reserve
調用時為什么代碼變慢 ,但是在調試版本中,插入了許多運行時檢查以捕獲更多錯誤,並且reserve
調用很有可能導致執行更多此類檢查,減慢代碼速度。
啟用優化,看看會發生什么。 :)
您是否在發布配置下執行了所有基准測試?
另外,請嘗試在Profiler之外運行,以防遇到一些Profiler引起的偽像(將手動時間測量值添加到代碼中-您可以為此使用clock()
)。
另外,您是否有機會打錯字並實際上稱為resize
而不是reserve
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.