我們公司有一個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性能好很多