上次的對比大家還有印象否,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 就如此擴充套件過