上次的對比大家還有印象否,C#Light和ulua對比各有勝負
今天我們加入一個去反射優化,這是uLua沒辦法實現的優化,我們也就只能不要臉的勝之不武了
以原生執行同一測試時間為X1,數字越小的越快
項目 | uLua | C#Light | C#light(去反射優化) |
性能測試一 | X4.5 | X4.5 | X2.19 |
性能測試二 | X4.3 | X3.63(快15%) | X3.01 |
性能測試三 | X6.87(快20%) | X9.01 | X3.77 |
這個測試我已經不需要幫你算快了多少了
C#Light測試執行時間都只有uLua的一半左右,全面碾壓。
由於uLua不是開源軟件,故測試程序刪除了uLua部分放在github上。有興趣的同學可以自取對比測試
https://github.com/lightszero/CSLightStudio/tree/master/CSLightStudio/unity/perfermance
那么我們是如何實現對uLua的全面碾壓的呢?lua不是號稱最快的腳本語言么。
首先先來幫大家破個謠言,lua從來不是最快的腳本語言,比他快的多得是。lua是號稱自己是最快的解釋型腳本語言。
C#Light就不是解釋型腳本語言,所以我們碾壓了uLua,也不代表lua在吹牛。
然后lua由於不是c#的原生實現,所以他在c#環境表現的水土不服,也嚴重的影響了他的發揮。
有另外一個lua的c#原生實現 unilua,可惜C#Light和uLua都比unilua快的太多,他完全不需要參加這場小小的對比。
在c#環境,腳本語言對於性能的損失,主要是損耗在反射上。
而C#Light對每一個類型有一層包裹,默認提供了一個通用包裹RegHelper_Type,是用反射實現的。
這個包裹造成了相當的性能損失,這次我們對測試的幾個類型使用了自定義包裹,得到了非常優化的性能,其實就是移除了反射的損耗。
而自定義包裹並不復雜
你只需要繼承通用包裹,加上自己的東西,比如這個Debug,調用其他的都一樣,僅當調用Debug.Log時,換成非反射的直接調用
自定義包裹還有其他的功能,比如在Debug.Log時加上調用腳本的文件名和行數
在 https://github.com/lightszero/CSLightStudio/tree/master/CSLightStudio/unity/Framework 中的例子,Debug.Log 就如此擴展過