hebbely 2011-08-23
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; }
运行结果:
我们在TString中没有看到lua将字符串的内容存在任何地方啊,其实lua是将内容同一存在了另一个地方,global_state中的strt里面:。接下来让我们来看看lua是怎样生成一个字符串的吧: