Re: [問題] 是否有方法加快vector resize的速度

看板C_and_CPP作者 (我要加入劍道社!)時間12年前 (2013/07/22 14:46), 編輯推噓7(707)
留言14則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《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)

07/23 00:07, , 1F
你得意思是慢是慢在vec init 會把裡面值都清成0嗎?
07/23 00:07, 1F

07/23 00:55, , 2F
07/23 00:55, 2F

07/23 09:13, , 3F
大推,原來是卡在應該使用assign。又上了一課,感謝:)
07/23 09:13, 3F

07/23 10:54, , 4F
推個... 這功能沒有這需求還蠻少用的
07/23 10:54, 4F

07/23 11:07, , 5F
慢的原因是因為 init嗎? 所以resize也會init?
07/23 11:07, 5F

07/23 11:09, , 6F
l大這例子 不是會多需要new一塊char buffer再delete,
07/23 11:09, 6F

07/23 11:09, , 7F
不會造成效率上變慢嗎?
07/23 11:09, 7F

07/23 12:34, , 8F
1. resize當然要init 2. 為什麼會多一次new?
07/23 12:34, 8F

07/23 13:41, , 9F
vec.assign(source, source+size); 這裡的source
07/23 13:41, 9F

07/23 13:42, , 10F
若原波 只是想開一個超大陣列先擋一下 而不是直接給初值
07/23 13:42, 10F

07/23 13:42, , 11F
這樣使用assign是不是多此一舉, 我用vc測 其實這幾種方式
07/23 13:42, 11F

07/23 13:43, , 12F
差異都不大耶@@
07/23 13:43, 12F

07/23 14:36, , 13F
「先擋一下」是做什麼?預先配置記憶體可以用reserve
07/23 14:36, 13F

07/25 00:02, , 14F
07/25 00:02, 14F
文章代碼(AID): #1HxKNVWh (C_and_CPP)
文章代碼(AID): #1HxKNVWh (C_and_CPP)