看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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一樣很慢。 上網google跟爬文都沒有找到有效的解決方法。 想請問一下各為先進,有什麼小技巧可以解決這樣的效能差距嗎? 感覺都是動態配置記憶體,vector的效率卻差了十倍? 我的目的只是單純是想用vector的方式動態分配一個很大的陣列。 因為相關的函數都是用vector來傳值的,如果不行的話就要大改了。 想請問一下各位先進,有什麼技巧可以解決這樣的效能差距嗎? 以上,煩請指教。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.45.115 ※ 編輯: xtxml 來自: 220.133.45.115 (07/22 18:27)
azureblaze:改用reserve看看? 07/22 18:35
azureblaze:ctor和resize應該會一個一個初始化所有元素 07/22 18:36
xtxml:我有想過,但reserve之後,如何改變vector的size呢? 07/22 18:37
azureblaze:所以比new []多了非常多個步驟 07/22 18:37
azureblaze:reserve之後一樣resize或push_back啊 07/22 18:38
azureblaze:普通的resize不會把buffer還回去,只有不夠會要更大的 07/22 18:39
xtxml:reserve之後resize我自己測是一樣慢,push_back則更慢 07/22 18:39
xtxml:似乎都會一個個去跑建構子 07/22 18:39
azureblaze:你是之後要直接用memcpy之類的東西指定值嗎? 07/22 18:43
xtxml:是的,當然不管size也是可以copy,只是感覺不太好XD 07/22 18:44
azureblaze:查了一下vector好像一定會initialize 07/22 18:46
azureblaze:自己寫一個Array吧 07/22 18:46
xtxml:如果最後無法避免的話,只好改array了 07/22 18:47
dododavid006:自己寫一個吧 速度慢算內部演算法的問題吧 07/22 20:55
damody:自己來啊! 事先先配置啊! dx 07/22 21:16
xtxml:回家又查了一下,看來無解,剛剛用陣列改好了,感謝大家:) 07/22 22:03
lc85301:veccccc這什麼名字啦… 07/23 12:11
xtxml:就,只是測試code亂取的,不要太在意:) 07/23 12:21
GNUGCC:必竟 vector<> 是屬於泛型類別樣板,它不像單純使用 new 配 07/25 03:12
GNUGCC:置記憶體而已...你可以看 vector<> 原始碼就知道它配置記憶 07/28 01:19
GNUGCC:體還做了那些事就能知道它的效率為何了. 07/28 01:20