lua中json和table的互转,是我们在平时开发过程中经常用到的。比如:
  1. 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据结构,如table。此时,就会用到table和json格式的互转。
  2. 在用lua编写的服务器中,如果我们通过redis来存储数据,由于redis中不存在table这种数据结构,因此,我们可以选择将table转换成json字符串来进行存储。在数据的存取过程中,也会用到table和json格式的互转。

以上两种场景中,json和table的互转使用频率是非常高的,如果转换效率有提升,对于降低我们业务延时将会有很大的帮助。因此,选择一种高效率的转换方式的重要性可见一斑。

下面我们简单介绍两种转换方式,并对他们的转换效率做一个对比。

  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 = ,
d = "",
e = {"hhh", "", ""},
f = {
a = "hello",
b = "world",
c = ,
d = "",
e = {"hhh", "", ""},
count =
}
}
local tm1 = os.time()
local str_json = ""
for i = , , 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 +
end
local tm2 = os.time()
print("tm1:" .. tm1 .. ",tm2:" .. tm2 .. ",dt:" .. (tm2 - tm1))
print(str_json)
结果1:使用json转换后的输出,耗时为51秒。
tm1:,tm2:,dt:
{"a":"hello","c":,"b":"world","e":["hhh","",""],"d":"","f":{"a":"hello","c":,"b":"world","e":["hhh","",""],"d":"","count":}}
结果2:使用cjson转换后输出,耗时为5秒。
tm1:,tm2:,dt:
{"a":"hello","c":,"b":"world","e":["hhh","",""],"d":"","f":{"a":"hello","c":,"b":"world","e":["hhh","",""],"d":"","count":}}
结论:
通过上面的实验,可以看到,通过cjson的转换效率基本是通过lua实现的json.encode()和json.decode()的10倍。

lua中,两种json和table互转方法的效率比较的更多相关文章

  1. net.sf.json和com.alibaba.fastjson两种json加工类的相关使用方法

    com.alibaba.fastjson Fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Jav ...

  2. 比较C#中几种常见的复制字节数组方法的效率

    在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffe ...

  3. 比较C#中几种常见的复制字节数组方法的效率[转]

    [原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadByte ...

  4. JavaScript中两种类型的全局对象/函数【转】

    Snandy Stop, thinking is the essence of progress. JavaScript中两种类型的全局对象/函数 这里所说的JavaScript指浏览器环境中的包括宿 ...

  5. jsp中两种include的区别【转】

    引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

  6. OC中两种单例实现方式

    OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

  7. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  8. 关于js中两种定时器的设置及清除(转载)

    1.JS中的定时器有两种: window.setTimeout([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法 ...

  9. mybatis中两种取值方式?谈谈Spring框架理解?

    1.mybatis中两种取值方式? 回答:Mybatis中取值方式有几种?各自区别是什么? Mybatis取值方式就是说在Mapper文件中获取service传过来的值的方法,总共有两种方式,通过 $ ...

随机推荐

  1. Windows 下MongoDB复制集配置

    1.下载服务.https://www.mongodb.com/   点击products 下拉第二列MongoDB server  选择 4.0.6 2.下载下来后 有限管理员运行 一路安装,可以不用 ...

  2. 使用 vue-cli(脚手架)搭建项目

    一.使用 vue-cli(脚手架)搭建项目 1) Vue-cli 是 vue 官方提供的用于搭建基于 vue+webpack+es6 项目的脚手架工具 2) 在线文档:https://github.c ...

  3. Linux搭建www,mail,ftp三大DNS服务器

    ##############################-----服务器端----###############################1. 安装bind# yum install bin ...

  4. 删除Win10远程桌面中的无用的IP列表

    运行中,输入regedit,然后找到这个位置(也可在任务管理器的地址栏中,直接输入下面的地址),便可删除远程桌面中列出的一些无用的IP地址. 计算机\HKEY_CURRENT_USER\Softwar ...

  5. js javascript 如何获取某个值在数组中的下标

    js 某个值在数组中的下标javascript中知道一个数组中的一个元素的值,如何获取数组下标JS 获取数组某个元素下标 函数方法 采用prototype原型实现方式,查找元素在数组中的索引值js查找 ...

  6. QString判断空 isEmpty

    isEmpty Returns true if the string has no characters; otherwise returns false. QString().isEmpty(); ...

  7. ES6的export与Nodejs的module.exports比较

    首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念. CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个 ...

  8. element-ui的表单验证this.$refs[formName].validate的代码不执行

    经过排查,如果自定义验证中,每种情况都要写明确和有回调函数callback var validatePhone = (rule, value, callback) => { const reg ...

  9. ERP WIP 部分API应用 详解

    工单创建 (create work order) PROCEDURE new_work_order(p_wip_entity_id NUMBER, p_organization_id NUMBER, ...

  10. $attrs/inheritAttrs可以实现组件的跨级传递

    $attrs/inheritAttrs可以实现组件的跨级传递  // 问题1  为什么this.$attrs可以得到主  传递过来的值         //$attrs 说明          //  ...