作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 是否有方法加快vector resize的速度
時間Mon Jul 22 22:46:51 2013
※ 引述《xtxml (赤木巧☠)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC.NET 2008
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: long t1111 = clock();
: vector<unsigned char> vecccc(2048*2048*4); //(1)
: long t2222 = clock();
: unsigned char* arrrr = new unsigned char[2048*2048*4];
: long t3333 = clock();
: long dt01 = t2222 - t1111;
: long dt02 = t3333 - t2222;
: printf("\n %d : %d\n",dt01,dt02);
: delete[] arrrr;
: debug: 40ms(vec) : 4ms(arr)
: release: 11ms(vec) : 0ms(arr)
: 註:(1)的部分換成resize一樣很慢。
你的目的是配置出空間後使用 memcpy 賦值
而這樣的比較是不公平的
因為 vector 多做了 default initialize 這件事
正確的比較方法是這樣的:
long size =
2048*
2048*
4;
unsigned char* source = ...
// data source
// array
clock_t t1 = clock();
unsigned char* array =
new unsigned char[size];
memcpy(array, source, size);
// or std::copy
clock_t array_time = clock() - t1;
// vector
clock_t t2 = clock();
vector<
unsigned char> vec;
vec.assign(source, source+size);
clock_t vector_time = clock() - t2;
cout <<
"array: " << array_time << endl;
cout <<
"vector: " << vector_time << endl;
這邊要注意兩個地方:
1. 對 vector 內容賦值不要用 memcpy 而是用 assign
assign 會檢查大小,不夠的時候會自動增長
2. 因為 assign 會自動增長,所以建立 vector 時就不需要指定 size
這麼一來也節省了 default initialize 的時間
上面的 code 我使用 VC++ 2010 執行
不管是否開 debug 兩邊的速度都是相同的
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.39.238.242
※ 編輯: littleshan 來自: 202.39.238.242 (07/22 22:47)
推 singlovesong:你得意思是慢是慢在vec init 會把裡面值都清成0嗎? 07/23 00:07
推 xvid:推 07/23 00:55
推 xtxml:大推,原來是卡在應該使用assign。又上了一課,感謝:) 07/23 09:13
推 Ebergies:推個... 這功能沒有這需求還蠻少用的 07/23 10:54
推 QQ29:慢的原因是因為 init嗎? 所以resize也會init? 07/23 11:07
→ QQ29:l大這例子 不是會多需要new一塊char buffer再delete, 07/23 11:09
→ QQ29:不會造成效率上變慢嗎? 07/23 11:09
→ littleshan:1. resize當然要init 2. 為什麼會多一次new? 07/23 12:34
推 QQ29:vec.assign(source, source+size); 這裡的source 07/23 13:41
→ QQ29:若原波 只是想開一個超大陣列先擋一下 而不是直接給初值 07/23 13:42
→ QQ29:這樣使用assign是不是多此一舉, 我用vc測 其實這幾種方式 07/23 13:42
→ QQ29:差異都不大耶@@ 07/23 13:43
→ littleshan:「先擋一下」是做什麼?預先配置記憶體可以用reserve 07/23 14:36
推 BlazarArc:推 07/25 00:02