作者james732 (好人超)
看板C_Sharp
标题[问题] new array位置导致效能巨大落差?
时间Tue Jan 21 14:58:03 2020
----
感谢TPNEW板友一言道破,两个版本的array大小根本就不一样....
----
我写了一个超简单的function,input一个file name与size (KB)
把这个档案读进来後,扩展到指定的大小,尾端补上0xff
input的档案大小约100KB,我要扩展到256KB
使用Visual studio Comunity 2019, .NET Framework 4.8
static void ExpendRomFile(string fileName, int size)
{
byte[] origin = File.ReadAllBytes(fileName);
byte[] output = new byte[size * 1024];
size *= 1024;
if (origin.Length == size)
return;
else if (origin.Length > size)
throw new Exception($"{fileName} size {origin.Length} 大於 {size}");
Array.Copy(origin, 0, output, 0, origin.Length);
for (int i = origin.Length + 1; i < output.Length; i++)
output[i] = 0xff;
File.WriteAllBytes(fileName, output);
}
後来想了想,如果if判断式成立,function提早结束
那麽我分配给output的空间不就是多做的吗?
因此把output配置空间那行往下搬
(左边为0.005秒版,右边为1.3秒版)
https://imgur.com/81ujFOC
结果却发生执行时间爆增,从原本的0.005秒变成了1.3秒
(使用StopWatch把ExpendRomFile包起来看)
使用ildasm看IL code,两者的Code size甚至是相同的
看起来似乎也只有一些顺序上的差异
(左边为0.005秒版,右边为1.3秒版)
https://imgur.com/a/9eImhiB (IL上半部)
https://imgur.com/a/7ZiPbXd (IL下半部)
使用分析工具看「慢速」的版本
它跟我说在回圈与最後的写档花了很多时间
https://imgur.com/j7s2Kox
可是这部份我两个版本的程式明明完全相同啊
「快速」的版本,分析工具甚至不显示ExpendRomFile这个function
看起来时间短到根本被忽略了...
试了一下Release与Debug都有一样的情况
以上的测试时间与IL Code都是Release版的
想请问,为什麽会有这麽大的执行时间差距呢?
我怎麽想都想不通 orz
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.71.213.162 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1579589885.A.427.html
1F:推 TPNEW: array大小不一样吧 01/21 15:49
2F:→ TPNEW: size*=1024 01/21 15:50
3F:→ TPNEW: 多了1024倍 01/21 15:50
啊!原来如此,是我耍笨了 orz
※ 编辑: james732 (111.71.213.162 台湾), 01/21/2020 16:19:43
※ 编辑: james732 (111.71.213.162 台湾), 01/21/2020 16:21:09