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倍。
相关文章
相关标签/搜索