[問題] new array位置導致效能巨大落差?

看板C_Sharp作者 (好人超)時間4年前 (2020/01/21 14:58), 4年前編輯推噓1(102)
留言3則, 1人參與, 4年前最新討論串1/1
---- 感謝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, 4年前 , 1F
array大小不一樣吧
01/21 15:49, 1F

01/21 15:50, 4年前 , 2F
size*=1024
01/21 15:50, 2F

01/21 15:50, 4年前 , 3F
多了1024倍
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
文章代碼(AID): #1U9g3zGd (C_Sharp)