看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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