详解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函数快一点点。