C Light 和 uLua的對比第二彈

2021-09-06 17:37:03 字數 1223 閱讀 4306

上次的對比大家還有印象否,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上。有興趣的同學可以自取對比測試

那麼我們是如何實現對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時加上呼叫指令碼的檔名和行數

在 中的例子,debug.log 就如此擴充套件過

this和super的對比

1 含義 this關鍵字表示本類當前物件的引用 哪個物件在呼叫this所在的方法,this就表示哪個物件 super關鍵字表示本類當前物件的父類的引用 哪個物件在呼叫super所在的方法,super就表示哪個物件中的父類部分的資料 this關鍵字詳解 super關鍵字詳解 2 super和this都...

堆和棧的對比

一般認為在c中分為這幾個儲存區 1棧 有編譯器自動分配釋放 2堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 3全域性區 靜態區 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊 區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式...

URL和URI的對比

例 建立url url myurl new url 解析該 為uri資料 uri uri uri.parse url和uri的區別 url的格式由下列三部分組成 第一部分是協議 或稱為服務方式 第二部分是存有該資源的主機ip位址 有時也包括埠號 第三部分是主機資源的具體位址。如目錄和檔名等。第一部分...