Re: [問題] 用變數宣告陣列
推
11/30 00:15,
11/30 00:15
通常 std 規定是 O(1) 的東西實作都不敢寫太差,不然會被 user 幹死。
→
11/30 00:17,
11/30 00:17
其實我懷疑這篇會慢的原因慢在下面紅色的地方:
for( i = 0 ; i < gsObj.m_vbParam.size() ; i++ )
Exceptional C++ 的作者有說過 C++ compiler 很難最佳化這段,
我記得他是微軟的人所以應該 MSVC 也是他說的那樣吧。
推
11/30 02:10,
11/30 02:10
C++ 程式建議用 -O3。
→
11/30 02:10,
11/30 02:10
→
11/30 02:12,
11/30 02:12
→
11/30 02:12,
11/30 02:12
→
11/30 02:12,
11/30 02:12
其實你擔心這個的話只要拆不同編譯單元再分別編譯,
讓 GCC 沒辦法同時看到兩邊就可以迴避被最佳化掉。
我也突然間認真了一下寫了測試 (純測 random access):
main.cxx: http://nopaste.csie.org/66a3a
helper.cxx http://nopaste.csie.org/3e5b1
array size 我設一億,
迴圈我也設定一億次,
取 index 我用 (rand() % 一億) 決定,
陣列沒有初始化應該沒差不重要,
有值就好,
main() 的 return sum1 == sum2 就單純是要強迫 GCC 的 O3 一定要 call 進 foo()。
環境:
OS: Gentoo Linux (kernel: 2.6.30-gentoo-r4) x86_64
CPU: Xeon 5160 x 2 (3.00GHz)
Compiler: gcc version 4.4.2 (Gentoo 4.4.2 p1.0)
編譯:
g++ -std=gnu++0x -O3 -c main.cxx
g++ -std=gnu++0x -O3 -c helper.cxx
g++ -std=gnu++0x -O3 main.o helper.o -o main
-std=gnu++0x 只是我單純想用 <cstdint>,
你不想下的話可以用 <stdint.h>。
執行五次 (上面是傳統 array 下面是 vector):
15656620 usecs
15083707 usecs
15568634 usecs
15183691 usecs
15544637 usecs
15078708 usecs
15562634 usecs
15151696 usecs
15550636 usecs
15171693 usecs
我看過 asm code 裡面都沒有其它雜質,
連 helper.cxx 的兩個 foo() 的差異也跟前篇講的一樣,
不過最好玩的地方還是...
如果我把 helper.cxx 裡的 sum += v[rand() % size] 改成循序存取,
也就是 sum += v[i],
差異會更明顯:
513922 usecs
229965 usecs
510923 usecs
229965 usecs
509923 usecs
229965 usecs
506922 usecs
229965 usecs
501924 usecs
229965 usecs
515922 usecs
229965 usecs
我試過改用 clock() 去量時間,
也試過調換兩個 foo() 被 call 的順序,
甚至是程式完全拆開來編成兩個各自跑,
結果都是一樣,
而且時間測量點內的 asm code 兩邊都長差不多,
傳統 array 那邊的 asm code 也沒被塞入其它雜質,
我猜應該跟 Intel 的 CPU 特性有關吧,
沒時間拿 vTune 慢慢看。
雖然我很懷疑是不是我不會量時間或 code 寫錯,
可是目前我自己暫時還看不出來就是了,
找不到錯的話我就當 vector 贏了喔 XD
--
Ling-hua Tseng (uranus@tinlans.org)
Department of Computer Science, National Tsing-Hua University
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage: https://www.tinlans.org
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.111.116
※ 編輯: tinlans 來自: 118.160.111.116 (11/30 10:51)
推
11/30 11:42, , 1F
11/30 11:42, 1F
→
11/30 11:43, , 2F
11/30 11:43, 2F
→
11/30 11:43, , 3F
11/30 11:43, 3F
→
11/30 14:12, , 4F
11/30 14:12, 4F
→
11/30 14:12, , 5F
11/30 14:12, 5F
→
11/30 14:14, , 6F
11/30 14:14, 6F
→
11/30 14:14, , 7F
11/30 14:14, 7F
→
11/30 14:16, , 8F
11/30 14:16, 8F
→
11/30 14:16, , 9F
11/30 14:16, 9F
推
11/30 14:20, , 10F
11/30 14:20, 10F
→
11/30 14:21, , 11F
11/30 14:21, 11F
→
11/30 14:21, , 12F
11/30 14:21, 12F
→
11/30 14:21, , 13F
11/30 14:21, 13F
→
11/30 15:30, , 14F
11/30 15:30, 14F
→
11/30 15:31, , 15F
11/30 15:31, 15F
→
11/30 15:31, , 16F
11/30 15:31, 16F
→
11/30 19:06, , 17F
11/30 19:06, 17F
推
12/01 04:56, , 18F
12/01 04:56, 18F
→
12/01 04:56, , 19F
12/01 04:56, 19F
→
12/01 04:57, , 20F
12/01 04:57, 20F
推
12/01 05:09, , 21F
12/01 05:09, 21F
→
12/01 05:10, , 22F
12/01 05:10, 22F
推
12/01 05:38, , 23F
12/01 05:38, 23F
→
12/01 05:39, , 24F
12/01 05:39, 24F
→
12/01 05:39, , 25F
12/01 05:39, 25F
推
12/01 06:08, , 26F
12/01 06:08, 26F
→
12/01 06:09, , 27F
12/01 06:09, 27F
推
12/01 06:14, , 28F
12/01 06:14, 28F
推
12/01 20:30, , 29F
12/01 20:30, 29F
→
12/02 09:01, , 30F
12/02 09:01, 30F
推
12/02 10:38, , 31F
12/02 10:38, 31F
推
12/02 10:50, , 32F
12/02 10:50, 32F
討論串 (同標題文章)