[問題] new array位置導致效能巨大落差?
----
感謝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://www.ptt.cc/bbs/C_Sharp/M.1579589885.A.427.html
推
01/21 15:49,
5年前
, 1F
01/21 15:49, 1F
→
01/21 15:50,
5年前
, 2F
01/21 15:50, 2F
→
01/21 15:50,
5年前
, 3F
01/21 15:50, 3F
啊!原來如此,是我耍笨了 orz
※ 編輯: james732 (111.71.213.162 臺灣), 01/21/2020 16:19:43
※ 編輯: james732 (111.71.213.162 臺灣), 01/21/2020 16:21:09
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章
10
17