从C调用Lua的最快方法是什么?

时间:2013-06-22 03:01:47

标签: c lua

我有一个HTTP服务器需要处理来自Lua代码的HTTP请求。从C代码中,我以这种方式调用一些Lua C API(想法来自here):

lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_loadfile(L, "some.lua");
lua_pcall(L, 0, 0, 0);   /* preload */
lua_getglobal(L, "handle");
lua_pushstring(L, "http_request");
lua_pcall(L, 1, 1, 0);
lua_close(L);

为每个HTTP请求运行这一堆代码。在多线程工作线程上下文中,此代码具有相当大的性能成本(从20000tps到100tps)。我想知道是否有更有效的方法从C 调用Lua代码?


更新

当我注释掉所有这些Lua C API调用时,我可以制作20000tps。但是当打开这个API调用时,100tps。在 some.lua 中进行一些更改(删除require调用时,只加载一个空的Lua文件),然后性能达到大约15000tps。

那么,这些API调用的成本约为5000tps,如何让这个API调用更快?

1 个答案:

答案 0 :(得分:2)

每个Lua状态使用一个线程安全的队列,并在无限循环中从队列中弹出状态。如果队列为空,则让状态等待插入队列时触发的条件。 我建议使用LuaJIT,因为它会优化原始线程API调用以接近近C速度。

除非您正在处理大量的HTTP请求,否则这不会对您有所帮助(如dsign所述)。

注意:此方法涉及为多个请求重用Lua状态。如果这是一个安全问题,您可以使用到期超时的每会话Lua状态执行某些操作......但我不确定。 (这是有状态服务器 - 客户端合作伙伴关系中的一个有趣的实验!您可以使用Lua状态来保存用户的整个会话,然后在有新请求时从睡眠状态恢复......这将很快。)