详解C调用lua脚本效率测试

C调用lua脚本效率测试是本文要介绍的内容,以下代码以C语言为基准,测试C调用Lua循环和循环调用Lua的效率。结论是不要频繁地穿越C/Lua边界.

  1. #include <time.h>
  2. extern "C"
  3. {
  4. #include "lua.h"
  5. #include "lualib.h"
  6. #include "lauxlib.h"
  7. }/* Lua解释器指针 */
  8. const char LUA_SCRIPT[] =
  9. "function loop_add(a, b)            "
  10. "   local sum = 0                   "
  11. "   for i = 1, 10000000 do          "
  12. "       sumsum = sum + a + b           "
  13. "   end                             "
  14. "   return sum                      "
  15. "end                                "
  16. "                                   "
  17. "function add(a, b)                 "
  18. "   return a + b                    "
  19. "end                                "
  20. ;
  21. // lua 脚本里面的函数由C调用
  22. int use_lua_add(lua_State *L, const char *func_name, int x, int y)
  23. {
  24. int sum;                        /* 通过名字得到Lua函数 */
  25. lua_getglobal(L, func_name);    /* 第一个参数 */
  26. lua_pushnumber(L, x);           /* 第二个参数 */
  27. lua_pushnumber(L, y);           /* 调用函数,告知有两个参数,一个返回值 */
  28. lua_call(L, 2, 1);              /* 得到结果 */
  29. sum = (int)lua_tointeger(L, -1);
  30. lua_pop(L, 1);
  31. return sum;
  32. }
  33. int main()
  34. {
  35. int i, sum = 0;
  36. clock_t tStart, tStop;
  37. lua_State *L = lua_open();  /* opens Lua */
  38. luaL_openlibs(L);
  39. if (luaL_dostring(L, LUA_SCRIPT))  // Run lua script
  40. {
  41. printf("run script failed/n");
  42. lua_close(L);
  43. return -1;
  44. }
  45. sum = 0;
  46. tStart = clock();
  47. for (i = 0; i < 10000000; i++)
  48. {
  49. sum += 1 + 1;
  50. }
  51. tStop = clock();
  52. printf("C++: %dms./nThe sum is %u./n",
  53. (tStop - tStart) * 1000 / CLOCKS_PER_SEC, sum);
  54. sum = 0;
  55. tStart = clock();
  56. sum = use_lua_add(L, "loop_add", 1, 1);
  57. tStop = clock();
  58. printf("Lua loop_add: %dms./nThe sum is %u./n",
  59. (tStop - tStart) * 1000 / CLOCKS_PER_SEC, sum);
  60. sum = 0;
  61. tStart = clock();
  62. for (i = 0; i < 10000000; i++)
  63. {
  64. sum += use_lua_add(L, "add", 1, 1);
  65. }
  66. tStop = clock();
  67. printf("Loop lua add: %dms./nThe sum is %u./n",
  68. (tStop - tStart) * 1000 / CLOCKS_PER_SEC, sum);
  69. lua_close(L);
  70. return 0;
  71. }

运行结果:

  1. C++: 31ms.
  2. The sum is 20000000.
  3. Lua loop_add: 437ms.
  4. The sum is 20000000.
  5. Loop lua add: 2360ms.
  6. The sum is 20000000.

小结:详解C调用lua脚本效率测试的内容介绍完了,希望通过本文的学习能对你有所帮助!

想看看c调用lua和lua调用c效率有多大差别吗?

加一种测试:

"function loop_cadd(a, b)            "    
    "   local sum = 0                   "   
    "   for i = 1, 10000000 do          "   
    "       sum = sum + csum(a,b)           "   
    "   end                             "   
    "   return sum                      "     
    "end                                "

其中csum是一个c函数
int csum(lua_State* l)
{
    int a = lua_tointeger(l,1) ;
    int b = lua_tointeger(l,2) ;
    lua_pushinteger(l,a+b) ;
    return 1 ;
}

测试结果如下:

C++: 21ms.
The sum is 20000000.
Lua loop_add: 640ms.
The sum is 20000000.
Lua loop_cadd: 3027ms.
The sum is 20000000.
Loop lua add: 3927ms.
The sum is 20000000.

结论是从lua调用c函数要比c调用lua函数快一点点。

转载于:https://www.cnblogs.com/xiayong123/p/3716951.html

详解C调用lua脚本效率测试相关推荐

  1. Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本

    Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...

  2. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  3. java 日志 异步_log4j 详解异步日志的配置和测试

    log4j 详解异步日志的配置和测试 日志可以帮助我们分析故障原因,做些数据挖掘的工作.最简单的日志方法,就是自己写个写文件的方法,在需要打日志的时候调用下,但是这显然不可能在实际工程上用.还有个问题 ...

  4. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  5. python调用ping命令并输出ttl_详解Python调用系统命令的六种方法

    作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有os.system().os.popen().subprocess.popen().subprocess.c ...

  6. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  7. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  8. vue调用手机相机相册_详解Vue调用手机相机和相册以及上传

    组件 选中{{imgList.length}}张文件,共{{bytesToSize(this.size)}} javaScript代码 export default { name: "cam ...

  9. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

最新文章

  1. 解决 wcf HTTP 无法注册 另一应用程序正在使用 TCP 端口 80
  2. java calendar字符串显示_java关于字符串和日期的代码展示
  3. python之路2.0_Python之路【第二十一篇】:JS基础
  4. 面试官:为什么 Spring 中的 bean 默认为单例?
  5. 惠普与4PS联络中心国际标准组织达成战略合作
  6. 移动端web页面自适应和rem
  7. 代码上传到github上
  8. Web 端的测试 Selenium 用法必备
  9. python和unity3d_请教:28岁女自学转行unity3d或python,能否给些选择建议?
  10. Windows常用shell命令
  11. 使用指针实现strcpy函数的功能
  12. Cadence Virtuoso IC617从原理图建立器件和生成版图
  13. SWIFT,国际清算与数字人民币
  14. matlab简易二维绘图函数的命令为,MATLAB绘图函数
  15. python3+ffmpeg下载B站视频,附代码
  16. java洁能租车计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  17. linux回环网卡,Linux回环网卡驱动设计
  18. 【上电即上华为云】华为云AIoT智联开发板_mcu_HK32F103Vx
  19. STM8L101时钟管理
  20. pixy php,Pixy快速入门指南.pdf

热门文章

  1. 数据库设计(三)概念数据模型
  2. server长时间运行query,Ajax刷新被block
  3. 【目录】 Git 教程
  4. window7不要光盘修复计算机,Win7若崩溃了就靠它——Win7系统修复光盘制作方法解析...
  5. python的字典与集合
  6. 如何高效学习 Kubernetes 知识图谱?
  7. 今日直播 | Apache Hudi x Apache Pulsar Meetup线上专场如期而至 大咖齐聚
  8. Spring Boot参数校验以及分组校验的使用
  9. Forrester 首席分析师对话阿里云容器服务负责人:容器的未来趋势是什么?
  10. 自定义 View 功能上线,你的小程序可以更多变