→ james732:可以觀察看看編譯出來MSIL 10/13 20:36
→ akasan:猜測可能迴圈版本有被編譯器辨識出來可用SIMD來處理 10/13 20:39
推 littleshan:先解釋一下你為什麼覺得拆開迴圈會比較快 10/13 20:41
→ james732:反組譯出來的MSIL,test1比test2大了610倍... 10/13 20:44
→ james732:不過看不出test2有用了什麼神奇的做法,好像只是普通迴圈 10/13 20:45
→ s3748679:@@a 因為這邊把迴圈拆了連i++和往回跳的動作都省啦~所以 10/13 20:49
→ s3748679:才會覺得在相同條件下會比較快就是了 10/13 20:49
→ x000032001:編譯器會最佳化阿~"~ 10/13 20:50
→ s3748679:嗯...(搔頭) 是說迴圈整個被省掉了...? 10/13 21:01
→ priv:cpblk 10/13 21:03
→ priv:一般純C++也會optimize成memcpy 10/13 21:03
→ priv:我剛剛很無聊幫你測試一下,我發現主要應該是assignment太多 10/13 21:07
→ priv:導致.net有額外的overhead 10/13 21:07
→ priv:在debug模式下,test1是15.xms,test2是0.2xms 10/13 21:09
→ priv:但是!! 如果在test1()和test2()裡面各用迴圈重跑十次 10/13 21:09
→ priv:test1是17.xms,test2是3.x ms 10/13 21:09
→ priv:也就是說一千次迴圈的確有它的overhead 10/13 21:10
→ priv:可是call一千行指令的function也有它的overhead 10/13 21:10
→ priv:光是call這個function還沒做事就導致它要花掉12ms以上 10/13 21:11
推 iamstudent:感謝這個測試,我本來想寫loop unrolling的template 10/13 21:19
→ s3748679:剛google了一下cpblk是指opcodes.cpblk(copy block)? 10/13 21:21
推 tropical72:我想小提一下,loop 有時確實展開較佳,這在bit hack 還 10/13 21:24
→ tropical72:是數值分析, 是蠻常被拿來加速的, 依情況而定. 10/13 21:24
推 iamstudent:這邊我想延伸問一個問題,如果不是完全展開迴圈 10/13 21:25
→ s3748679:有了~我把計時器擺進function內,結果為0.0107, 0.0054 10/13 21:26
→ iamstudent:而是改成一次跳一段,loop counter判斷會變少,會快嗎 10/13 21:26
→ tropical72:@s3748679, 我推你原版 timer 被 release 亂放或洗掉. 10/13 21:27
→ tropical72:@iamstudent: 真有緇硃必究到這種地步的話,建議去看 10/13 21:32
→ tropical72:asm怎麼翻的,永遠不知道compiler會免費服務到什麼地步. 10/13 21:32
→ tropical72:"理論上" 減少branch,確實是可達到加速功效。 10/13 21:33
推 iamstudent:感謝回答,所以還是應該要用實際測試來判斷結果 10/13 21:37
→ tropical72:演算法改善永遠放第一,細節優化永遠放演算法後面。 10/13 21:39
→ s3748679:(啊對~ 忘了說剛那數據是我能關的最佳化都關的情況下測的 10/13 21:44
→ s3748679:(晚點來搞搞看,想辦法不讓它cpblk =w= 10/13 21:45
→ james732:其實我懷疑在runtime的時候還有做一次最佳化... 10/13 22:13
→ james732:畢竟這種二次編譯的程式,要動手腳的機會好像更多?XD 10/13 22:14
→ akasan:關最佳化並沒有任何的意義... 10/13 22:15
→ s3748679:原來編譯能幹那麼多偷雞摸狗的事喔..(汗 10/13 23:02
→ james732:compiler是個很恐怖的東西啊.... 10/13 23:04
推 stosto:理論上有一種叫做預測 10/15 01:31