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

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


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

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

运行结果:

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

posted @ 2014-04-15 17:17  Lunaa  阅读(1069)  评论(0编辑  收藏  举报