编辑:不幸的是,LuaJIT在下面的链接中被取消了比较.
这种编程语言的比较表明,LuaJIT比普通的Lua实现有十倍以上的改进.为什么变化如此之大?是否有一些特定的Lua使得它从JIT编译中受益匪浅?Python是动态类型化的,并且也被编译为字节码,那么为什么PyPy(我相信现在有JIT)显示出如此大的性能提升?
根据计算机语言基准测试游戏,LuaJIT实现似乎击败了所有其他JIT-ed动态语言(V8,Tracemonkey,PLT Scheme,Erlang HIPE)一个数量级.
我知道这些基准测试不具代表性(正如他们所说:"哪种编程语言实现具有最快的基准测试程序?"),但这仍然令人印象深刻.
在实践中,情况确实如此吗?有人测试过Lua的实现吗?
如何将Lua脚本编译成单个可执行文件,同时还能获得LuaJIT的超快性能优势?
背景:
.lua
组成我的Web应用程序的文件(来自模型/视图/控制器)为了简化部署,我想将运行我的Web应用程序的所有.lua脚本编译成单个可执行文件.
这可能吗?怎么样?
似乎Lua官方附带了一个名为SRLua的库
我安装http-lua-module
了nginx,制作了一个完美无缺的脚本,但现在我想确定nginx
使用LuaJit
而不是Lua
(因为我的研究显示LuaJit更快).
我添加到.bushrc
那些代码行:
export LD_LIBRARY_PATH=/usr/local/luajit/lib:$LD_LIBRARY_PATH
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
Run Code Online (Sandbox Code Playgroud)
我也重新编译了nginx,现在我只想确保它使用LuaJit.
我想知道来自命令行的用户何时按下control-c,这样我就可以节省一些东西.
我该怎么做呢?我看了,但还没有看到任何东西.
注意:我对lua有点熟悉,但我不是专家.我主要使用lua来使用库Torch(http://torch.ch/)
我正在编写一个小的Lua项目并使用Luarocks来安装我的第三方依赖项.我机器上的默认Lua版本是5.2,到目前为止一切正常.
但是,今天我偶然发现了一个令我困惑的问题.我想在Lua 5.1和Luajit上运行我的程序,看看它是否也适用于那些版本,但我很难让Luarocks下载相应版本的依赖项.作为最后的手段,我试图告诉Lua5.1使用Luarocks安装的5.2库(通过将LUA_PATH
环境变量设置为相同的值LUA_PATH_5_2
)但不幸的是这还不够:我的项目依赖于LuaFileSystem,一个C-基于模块,所以我需要为5.1和5.2安装单独的版本.
如何安装依赖项的5.1和5.2版本,我该怎么办?我是否需要将一些参数传递给luarocks install
命令?我是否需要在我的机器上安装多个Luarocks实例?令我困惑的一件事是.luarocks
文件夹里面的东西被分类在5.2子文件夹下(〜/ .luarocks/share/lua/5.2 /),这表明可能有办法在兄弟5.1
文件夹中安装东西但是在同时只有一个bin
文件夹,这表明luarocks一次只能处理一个版本的Lua ...
我正在尝试将LuaJIT嵌入到C应用程序中.代码是这样的:
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>
int barfunc(int foo)
{
/* a dummy function to test with FFI */
return foo + 1;
}
int
main(void)
{
int status, result;
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
/* Load the file containing the script we are going to run */
status = luaL_loadfile(L, "hello.lua");
if (status) {
fprintf(stderr, "Couldn't load file: %s\n", lua_tostring(L, -1));
exit(1);
}
/* Ask Lua to run our little script */
result …
Run Code Online (Sandbox Code Playgroud) 概述是我正在编写代码来理解我的问题空间,并且我遇到了'PANIC:调用Lua API(内存不足)时出现无保护错误'错误.我正在寻找绕过这个限制的方法.
环境底线是Torch,一个在LuaJIT上运行的科学计算框架,LuaJIT在Lua上运行.我需要Torch,因为我最终想要在GPU上使用神经网络来解决我的问题,但为了实现这一目标,我需要很好地表达问题以提供给网络.我(卡住)在Centos Linux上,我怀疑尝试从32位模式重建源代码(据报道将LuaJIT内存限制扩展到4gb)将是一个噩梦,如果它适用于所有的库.
问题空间本身可能不是特别相关,但总的来说,我有点数据文件,我计算这些距离之间的距离然后bin(即直方图)这些距离试图找出最有用的范围.方便的是,我可以创建复杂的Lua表,其中包含各种箱子和torch.save(),这些都是数不清的,然后在以后拿起并检查不同的标准化等等 - 所以经过一个月的游戏后我发现这是真的很容易和强大.
我可以使它看起来最多3个距离,每个15个容器(15x15x15加上开销),但这只是通过添加显式的garbagecollection()调用并使用fork()/ wait()为每个数据文件,以便外部循环将保持运行,如果一个数据文件(几千)仍然打破内存限制并使孩子崩溃.当每个成功的子进程现在必须读取,修改和写入当前的bin计数集时,这会变得非常痛苦 - 我最大的文件目前是36mb.我想要更大(更多的垃圾箱),并且真的更愿意只持有15个我无法访问的RAM的计数.
所以,这里有一些我想过的路径; 如果你能确认/否认他们中的任何一个会/不会让我超出1gb边界,或者只是提高我的效率,请发表评论.如果您可以提出我没想过的其他方法,请发表评论.
我错过了一个触发Lua进程的方法,我可以从中读取任意表格吗?毫无疑问,我可以将我的问题分解成更小的部分,但是从stdio解析返回表(从系统调用到另一个Lua脚本)似乎容易出错,而写入/读取小型中间文件将是很多磁盘i/o.
我错过了一个存储和访问表高内存模块?这似乎是我真正想要的,但还没有找到它
FFI C数据结构可以放在1gb之外吗?看起来似乎并非如此,但我当然缺乏对造成限制的原因的全面理解.我怀疑这会让我比普通的Lua表更能提高效率,因为这些表已经超越原型设计了吗?(除非我为每个更改做了一堆编码)
当然我可以通过在C中写一个扩展来解决(Torch似乎支持超出限制的网络),但是我的简短调查发现了对'lightuserdata'指针的引用 - 这是否意味着更正常的扩展赢了也不到1gb以外?这看起来似乎也应该是原型制作练习的开发成本.
我很了解C,所以走FFI或扩展路线并没有打扰我 - 但我从经验中知道,以这种方式封装算法既可以非常优雅,又可以通过两个地方来隐藏错误.处理包含堆栈中表格中的表格的数据结构似乎也不是很好.在我做出这些努力之前,我想确定最终结果真的能解决我的问题.
感谢阅读长篇文章.
我最近调查了Lua,看起来真的很棒.唯一令人烦恼的是它缺乏(标准)库.但随着JIT编译器出现了一个很好的FFI C接口.
来自java背景,我试图尽可能地避免使用C,所以我的问题是:有任何人对LuaJIT有一些经验,特别是它的FFI接口,以及为几乎没有知识的人设置库有多困难C?
lua ×10
luajit ×10
torch ×3
c ×2
ffi ×2
jit ×2
nginx ×2
compilation ×1
luarocks ×1
windows-8.1 ×1