ILRuntime性能測試


我們公司有一個Unity原生開發語言C#寫的項目,目前已經在安卓測試過多次,上架IOS在考慮熱更,所以對ILRuntim進行性能測試,在測試過程中已經按照官方文檔進行了CLR綁定和生成Release的Dll,並且在非Editor環境下測試。

我的測試環境:ILRuntime 1.6.3 ,MuMu模擬器和華為手機

50萬次的加法運算

ILRuntime使用全局變量:UnitTest_Performance50萬 Elapsed time:1050ms, result = 445698416 ,Tick:10527445

ILRuntime使用局部變量:UnitTest_Performance50萬 Elapsed time:534ms, result = 445698416 ,Tick:5436060

Unity原生代碼:mono UnitTest_Performance50萬 Elapsed time:1ms, result = 445698416 ,Tick:19900

xlua中lua:[10:42:43.8636]LUA: cost: 4.00ms

C#測試代碼

 public static void UnitTest_Performance3()
{
	var before = DateTime.Now.Ticks;
	System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
	sw.Start();
	int cnt = 0;
	for (int i = 0; i < 500000; i++)
	{
		cnt += i;
	}
	sw.Stop();
	var tick_diff = DateTime.Now.Ticks - before;
	Debug.Log(string.Format("UnitTest_Performance50萬 Elapsed time:{0:0}ms, result = {1}  ,Tick:{2}", sw.ElapsedMilliseconds, cnt,tick_diff));
}

Lua測試代碼

local begin = os.clock()
local cnt = 0;
for i = 1, 500000 do
	cnt = cnt + i;
end
local diff =  os.clock() - begin;
print(string.format("cost:%.2f ms", diff*1000))

從測試結果可以看到在Lua做加法運算的性能會比ILRuntime中好一百倍左右,對於需要大量運算的確實如ILRuntime的文檔所以不應該放熱更代碼中

為什么不測試熱更調主工程?

在這個項目中,從熱更調用主工程代碼,相對比較少,大部分都是在熱更工程中使用計算,比如對象管理,戰斗部分,玩法邏輯。

從ILRuntime的文檔中提到跨域調用會比Lua快很多

空Update也耗時

對於MonoBehaviour中的空Update,當執行上千次時,耗時在0.1ms,所以要去掉空內容的Update

建議

棧和堆差別非常大

上面局部變量和全局變量的耗時差別很大,是因為局部變量是存儲在棧中,而全局變量是存儲在堆中,一定要注意在進行遍歷一個列表時,在方法內先使用local xx = 全局變量,這樣對於性能的提升是非常有效的

邏輯運算問題會放大數百倍

如果項目計划使用ILRuntime熱更,強烈建議在項目初期就接入,這樣能及早發現邏輯代碼效率問題,及早解決掉。

一定要仔細閱讀官方的文檔,避免踩到雷區,比如foreach會產生GC Allow,熱更代碼中避免頻繁大量的計算和空函數調用,對於有很多的空Update也需要去掉

不要使用foreach

在每秒執行的update中使用for會比foreach性能好很多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM