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/cn.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灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP