lua中,兩種json和table互轉方法的效率比較

lua中json和table的互轉,是咱們在平時開發過程當中常常用到的。好比:
  1. 在用lua編寫的服務器中,若是客戶端發送json格式的數據,那麼在lua處理業務邏輯的時候,必然須要轉換成lua本身的數據結構,如table。此時,就會用到table和json格式的互轉。
  2. 在用lua編寫的服務器中,若是咱們經過redis來存儲數據,因爲redis中不存在table這種數據結構,所以,咱們能夠選擇將table轉換成json字符串來進行存儲。在數據的存取過程當中,也會用到table和json格式的互轉。

以上兩種場景中,json和table的互轉使用頻率是很是高的,若是轉換效率有提高,對於下降咱們業務延時將會有很大的幫助。所以,選擇一種高效率的轉換方式的重要性可見一斑。git

下面咱們簡單介紹兩種轉換方式,並對他們的轉換效率作一個對比。github

  1. 第一種是用lua實現的json和table互轉方式,這種比較常見,須要瞭解使用方法及源碼,請訪問該項目在github上的源碼。
  2. 第二種叫cjson,是用C實現的。redis中的eval命令支持lua操做數據庫,所以,cjson也在redis中獲得使用,咱們能夠redis的源碼庫中拉倒cjson的源碼
下面簡單對比一下,分別經過這兩種方式轉換的效率,到底差多少?
測試方法:建立一個lua中的table,反覆將lua轉換成json,再將json轉換成lua,如此循環屢次,此處咱們循環50000次,而且在每次轉換過程當中,對其中一個變量count進行遞增計算,便於咱們最終來檢驗轉換過程當中數據的正確性。
    local t = {
        a = "hello",
        b = "world",
        c = 123456,
        d = "123456",
        e = {"hhh", "11", "22"},
        f = {
            a = "hello",
            b = "world",
            c = 123456,
            d = "123456",
            e = {"hhh", "11", "22"},
            count = 0
        }
    }
    local tm1 = os.time()
    local str_json = ""
    for i = 1, 50000, 1 do
        --str_json = json.encode(t)
        --t = json.decode(str_json)
        str_json = cjson.encode(t)
        t = cjson.decode(str_json)
        t.f.count = t.f.count + 1
    end
    local tm2 = os.time()
    print("tm1:" .. tm1 .. ",tm2:" .. tm2 .. ",dt:" .. (tm2 - tm1))
    print(str_json)
結果1:使用json轉換後的輸出,耗時爲51秒。
tm1:1575363384,tm2:1575363435,dt:51
{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","f":{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","count":49999}}
結果2:使用cjson轉換後輸出,耗時爲5秒。
tm1:1575363457,tm2:1575363462,dt:5
{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","f":{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","count":49999}}
結論:
經過上面的實驗,能夠看到,經過cjson的轉換效率基本是經過lua實現的json.encode()和json.decode()的10倍。
相關文章
相關標籤/搜索