zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

效率测试 详解 脚本 调用 lua
2023-06-13 09:11:15 时间

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

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

#include <time.h> 
 
extern "C"  
{  
#include "lua.h"  
#include "lualib.h"  
#include "lauxlib.h"  
}/* Lua解释器指针 */  
 
const char LUA_SCRIPT[] =  
    "function loop_add(a, b)            "  
    "   local sum = 0                   "  
    "   for i = 1, 10000000 do          "  
    "       sumsum = sum + a + b           "  
    "   end                             "  
    "   return sum                      "  
    "end                                "  
    "                                   "  
    "function add(a, b)                 "  
    "   return a + b                    "  
    "end                                "  
    ;  
 
// lua 脚本里面的函数由C调用  
int use_lua_add(lua_State *L, const char *func_name, int x, int y)  
{  
    int sum;                        /* 通过名字得到Lua函数 */  
    lua_getglobal(L, func_name);    /* 第一个参数 */  
    lua_pushnumber(L, x);           /* 第二个参数 */  
    lua_pushnumber(L, y);           /* 调用函数,告知有两个参数,一个返回值 */  
    lua_call(L, 2, 1);              /* 得到结果 */  
    sum = (int)lua_tointeger(L, -1);  
    lua_pop(L, 1);  
    return sum;  
}  
 
int main()  
{  
    int i, sum = 0;  
    clock_t tStart, tStop;  
 
    lua_State *L = lua_open();  /* opens Lua */  
    luaL_openlibs(L);  
    if (luaL_dostring(L, LUA_SCRIPT))  // Run lua script  
    {  
        printf("run script failed/n");  
        lua_close(L);  
        return -1;  
    }  
 
    sum = 0;  
    tStart = clock();  
    for (i = 0; i < 10000000; i++)  
    {  
        sum += 1 + 1;  
    }  
    tStop = clock();  
    printf("C++: %dms./nThe sum is %u./n",  
           (tStop - tStart) * 1000 / CLOCKS_PER_SEC, sum);  
 
    sum = 0;  
    tStart = clock();  
    sum = use_lua_add(L, "loop_add", 1, 1);  
    tStop = clock();  
    printf("Lua loop_add: %dms./nThe sum is %u./n",  
           (tStop - tStart) * 1000 / CLOCKS_PER_SEC, sum);  
             
    sum = 0;  
    tStart = clock();  
    for (i = 0; i < 10000000; i++)  
    {  
        sum += use_lua_add(L, "add", 1, 1);  
    }  
    tStop = clock();  
    printf("Loop lua add: %dms./nThe sum is %u./n",  
           (tStop - tStart) * 1000 / CLOCKS_PER_SEC, sum);  
    lua_close(L);  
    return 0;  
} 

运行结果:

C++: 31ms.  
The sum is 20000000.  
Lua loop_add: 437ms.  
The sum is 20000000.  
Loop lua add: 2360ms.  
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函数快一点点。