C_Sharp 板


LINE

※ 引述《erspicu (.)》之銘言: : 全code.... : http://paste.ofcode.org/3bw8ufpUwuPqT4xNfwUScZH : 你覺得在你預設的猜測中 : a. : color = (uint)((0xff << 24) | ((rgb555 & 0x1f) << 19) | ((rgb555 & 0x3e0) : << 6) | ((rgb555 & 0x7c00) >> 7)); : b. : color = rgb555_Table[rgb555 ]; : 你會覺得哪個速度比較快???? : 一個是好幾次的bitwise計算算出結果.. : 一個是用index撈取array一個步驟 : 答案是 a 比較快... 不管是debug模式下或是一般模式 : (現在一般電腦的情況...cpu效能超高,一般記憶體沒追上cpu速度) : 只是一般模式a快得更多 : 而pointer的寫法 debug模式下,快一般array的操作方式一點,一般模式, : 用指標跟ARRAY速度差不多(應該是一樣).... : pointer在c#好像不只一種方式操作 測試環境為 VS2015 .net 4.6.1 Release build 64位元執行模式 直接觀察反組譯碼 在原測試code中第51行 color = (uint)((0xff << 24) | ((rgb555 & 0x1f) << 19) | ((rgb555 & 0x3e0) << 6) | ((rgb555 & 0x7c00) >> 7)); 這句只會執行一次(最後一次) 而不是10000*65535次 (反而第50行 rgb555 = (ushort)(i & 0xffff); 老老實實的執行了10000*65535次 優化的邏輯真奇怪) 而array只會檢查i有沒有超過陣列界限65535次 不會取值 pointer 則是CLR的bug https://github.com/dotnet/coreclr/issues/2480 每次存取fixed的pointer時 都重新從local variables載入到CPU register (暫時的解法是把pointer複製出來一份) 所以結果為 37X 19X 55X ms ==== 測試code http://paste.ofcode.org/d8tZ28wfK3iA5Mi3kLuvAR 不確定在原測試code 63行有沒有寫錯 color = rgb555_Table_pointer[i]; 測試code通通改成用 color = rgb555_Table_pointer[rgb555]; 註: GC.KeepAlive() 是拿來模擬一個method call 避免取值賦值被優化掉 其方法內容是空白 如果不呼叫GC.KeepAlive() 而自己寫空方法的話 一樣會被優化掉 http://referencesource.microsoft.com/#mscorlib/system/gc.cs,18b31b2edcc0f711 在加上GC.KeepAlive(color); 的狀況下 Array 32XX ms bitwise 34XX ms pointer 30XX ms 而這個測試也順便測試JIT warm up 的影響 以及傳說 "int的操作有特別優化" 這兩件事 看起來是沒什麼影響 ==== : 參考 : http://nbsoftsolutions.com/blog/high-performance-unsafe-c-code-is-a-lie 這篇文章剛好挑到一個在.net中極度優化的類別 string 所以會得到使用指標沒有什麼加速效果的結論 : stringBuilder.Append((char)currentByte); 內部為char array pointer操作 http://referencesource.microsoft.com/#mscorlib/system/text/ stringbuilder.cs.html,a2e7c78d85807da5 : stringBuilder.ToString() 內部為pointer操作 http://referencesource.microsoft.com/#mscorlib/system/text/ stringbuilder.cs,5a97da49a158a3c9 : charBuffer[index++] = (char)currentByte; : new string(charBuffer, 0, index); : *bytePtr++ = currentByte; : new string((sbyte*)byteArray); : charPtr++ = (char)currentByte; : new string(charPtr); string的建構子內部均為為C++實作 以String(char [] value)為例 http://referencesource.microsoft.com/#mscorlib/system/ string.cs,ec408439366007e6 https://github.com/dotnet/coreclr/blob/master/src/vm/ecalllist.h#L220 https://github.com/dotnet/coreclr/blob/master/src/ classlibnative/bcltype/stringnative.cpp#L99 https://github.com/dotnet/coreclr/blob/master/src/vm/object.cpp#L2086 測試出來的結果相當是正常的 如果有比較慢 有可能是做了多餘的轉型導致 網路上也有使用unsafe大幅加速的例子 可參考 http://blog.darkthread.net/post-2010-06-19-use-unsafe.aspx --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.230.204.189
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_Sharp/M.1451718428.A.A19.html
1F:→ Litfal: 64位元環境的確會有這個短迴圈只跑一次的問題,我也不知道 01/02 15:28
2F:→ Litfal: 是神優化還是BUG,用32BIT或把color提到class field才能 01/02 15:30
3F:→ fo40225: 剛測試 32位元一樣只跑一次 class field就不會只有一次了 01/02 15:38
4F:推 erspicu: 一直覺得優化原則.JIT 若沒摸都反組譯那層 被包著 01/02 18:24
5F:→ erspicu: 沒辦法深入看進去的話 一切都很謎樣... 可能真的要來學了 01/02 18:24
※ 編輯: fo40225 (61.230.213.119), 01/09/2016 21:39:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP