[問題] vector emplace_back() 花費時間問題

作者: laughingman (笑面男)   2022-01-11 23:06:32
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
問題(Question):
我用以下的程式碼來測量vector emplace_back(int)所需要的時間,
為了避免vector重新分配記憶體多花的時間,
我先用reserve()將vector的容量調到我需要的大小:
#include <iostream>
#include <vector>
uint64_t get_tscp()
{
uint64_t a, d;
__asm__ volatile("rdtscp" : "=a"(a), "=d"(d));
return (d << 32) | a;
}
int main()
{
std::vector<int> v;
int size = 4096;
v.reserve(size);
for (int i = 0; i < size; ++i)
{
auto t1 = get_tscp();
v.emplace_back(i);
auto t2 = get_tscp();
std::cout << (t2 - t1) / 2.6 << std::endl;
}
return 0;
}
結果我發現emplace_back(int)所花費的時間大多在15ns上下,
但在第1021、2045、3069次loop,花費的時間突然暴增到2us左右,
請問各位大神有沒有什麼想法可以指點一下小弟,怎麼解釋這種情形?
感恩。
作者: stucode   2022-01-11 23:18:00
直覺猜是 cache miss。
作者: sarafciel (Cattuz)   2022-01-11 23:22:00
應該是page miss , linux一個page大小預設是4KB
作者: g0010726 (Kevin)   2022-01-12 02:41:00
先說個問題 建議不要在迴圈裡做I/O,尤其是又用了endl去flush buffer。目前這樣很有可能測得時間大部分是i/o的時間XD畢竟有時候真的不知道os的io順序是怎樣
作者: laughingman (笑面男)   2022-01-12 03:09:00
回g大,我以為get_tscp()內的rdtscp就避免掉cpu亂序執行的問題,還是我有考慮不周的地方?再麻煩告知。回前兩樓,有什麼可以證明是cache miss或是pagefault的方法嗎?可以稍微指點一下嗎?感恩<(_ _)>
作者: mmmmei (mmm煤)   2022-01-12 07:45:00
int換double看看?
作者: laughingman (笑面男)   2022-01-12 10:47:00
我用getconf PAGESIZE得到page大小為4096byte,然後我的int大小為4byte,double為8byte,我換成double後變成在512倍數次loop時間就會變大,所以應該是page fault造成的,感謝上面各位高手<(_ _)>

Links booklink

Contact Us: admin [ a t ] ucptt.com