看看LLVM-lua的性能吧!
script lua llvm-lua native luajit
ackermann 2.20 2.31 1.88 0.40
ary 1.06 0.60 0.54 0.27
binarytrees 1.62 1.47 1.36 0.97
chameneos 1.13 0.71 0.63 0.23
except 1.12 0.97 0.87 0.49
fannkuch 1.40 0.81 0.69 0.29
fibo 0.83 0.54 0.50 0.13
harmonic 1.28 0.42 0.28 0.23
hash 1.08 1.12 0.91 0.89
hash2 1.07 0.90 0.86 0.49
heapsort 1.09 0.61 0.50 0.25
hello 0.00 0.07 0.00 0.00
knucleotide 0.66 0.72 0.56 0.44
lists 1.04 0.83 0.69 0.43
matrix 1.06 0.64 0.55 0.29
meteor 3.95 6.03 4.52 1.20
methcall 1.14 0.85 0.70 0.42
moments 0.93 0.87 0.74 0.87
nbody 1.05 0.78 0.54 0.23
nestedloop 1.06 0.39 0.28 0.16
nsieve 1.12 0.89 0.79 0.59
nsievebits 1.39 0.84 0.66 0.23
objinst 1.02 0.97 0.84 0.77
partialsums 1.01 0.74 0.63 0.30
pidigits 1.21 1.72 1.30 0.56
process 0.00 0.82 0.90 0.82
prodcons 0.98 0.68 0.58 0.29
random 1.09 0.54 0.50 0.22
recursive 1.27 0.80 0.65 0.15
regexdna 0.97 1.04 1.23 0.96
regexmatch 0.26 0.34 0.28 0.26
revcomp 0.36 0.50 0.39 0.24
reversefile 0.44 0.45 0.45 0.40
sieve 1.03 0.62 0.55 0.28
spectralnorm 1.23 0.66 0.54 0.27
spellcheck 0.74 0.77 0.76 0.72
strcat 0.87 0.82 0.70 0.63
sumcol 0.81 0.88 0.81 0.85
takfp 0.43 0.35 0.27 0.07
wc 0.92 1.02 1.09 1.40
wordfreq 0.68 0.73 0.65 0.62
Total 42.60 37.82 32.17 19.31
“LLVM-Lua, is a JIT and static Lua compiler”
无语,需要的话不久上传部分测试算法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
language |- |--- 25% median 75% ---| -|
C++ GNU g++ 1.00 1.00 1.00 1.00 1.03 1.08 6.61
C GNU gcc 1.00 1.00 1.00 1.00 1.24 1.59 28.81
ATS 1.01 1.01 1.16 1.67 4.67 8.54 8.54
Java 6 steady state 1.20 1.20 1.32 1.81 2.29 3.75 22.31
Java 6 -server 1.22 1.22 1.39 1.94 2.85 5.03 9.85
Ada 2005 GNAT 1.00 1.00 1.59 2.28 6.51 9.93 9.93
Scala 1.17 1.17 1.88 2.60 4.13 7.50 21.01
C# Mono 1.33 1.33 1.80 2.75 10.75 24.17 51.22
Lisaac 1.19 1.19 1.61 2.79 4.08 5.21 5.21
Haskell GHC 1.01 1.01 2.23 2.85 4.63 8.21 10.34
OCaml 1.94 1.94 2.73 3.33 5.60 9.90 348.40
Lisp SBCL 1.52 1.52 2.36 3.63 5.10 9.21 29.98
Pascal Free Pascal 1.53 1.53 1.76 4.18 6.28 12.98 12.98
Clean 1.38 1.38 3.14 5.17 7.87 14.97 18.46
Fortran Intel 1.16 1.16 1.61 6.11 9.50 21.34 27.36
F# Mono 2.40 2.40 3.87 7.75 28.47 35.66 35.66
Lua LuaJIT 1.33 1.33 6.04 11.90 20.10 41.19 76.88
Erlang HiPE 3.41 3.41 7.36 15.86 25.88 53.65 155.27
Scheme PLT 1.50 1.50 12.35 17.20 74.55 167.85 309.78
Java 6 -Xint 1.87 1.87 12.05 19.57 25.72 46.23 56.30
JavaScript V8 7.63 7.63 13.23 30.39 57.11 69.12 69.12
Smalltalk VisualWorks 8.90 8.90 15.70 30.94 55.55 115.33 179.94
Lua 1.34 1.34 18.99 35.03 89.41 149.07 149.07
Groovy 7.99 7.99 23.25 37.87 82.37 171.06 301.88
JavaScript TraceMonkey 2.02 2.02 16.54 44.74 137.02 317.75 944.04
Python 3 5.68 5.68 27.09 48.15 117.54 253.22 346.06
PHP 2.03 2.03 8.30 54.77 88.56 118.51 118.51
Mozart/Oz 7.51 7.51 31.54 58.90 172.77 364.95 364.95
Python 1.98 1.98 25.37 63.66 120.11 262.23 309.41
Perl 2.15 2.15 32.52 79.32 237.49 483.76 483.76
Ruby JRuby 14.97 14.97 32.86 92.26 161.05 353.34 721.44
Ruby 1.9 8.37 8.37 30.77 99.90 221.36 507.24 1060.61
Ruby 8.59 8.59 66.68 183.10 337.07 742.66 1938.82
基准测试用的机器
Ubuntu™ : Intel® Q6600® quad-core
x64 Ubuntu™ : Intel® Q6600® quad-core
x64 Ubuntu™ : Intel® Q6600® one core
Ubuntu™ : Intel® Q6600® one core
OS
Ubuntu™ 9.04 Linux Kernel 2.6.28-15-generic
http://shootout.alioth.debian.org/
你可以注册一个ID,提交自己的测试算法。
http://math.nist.gov/scimark2/
这个是第一贴的算法地址,这个程序小,偏向数学运算。
这正的语言测试还是参考:
http://shootout.alioth.debian.org/
LLVM测试参照基准luaJIT 的说明
功能
所有的函数缺省会被JIT(即时编译器)编译到本地机器码:
* 没有被使用的函数不会被编译.
* 可以选择性打开和关闭即时编译函数,子函数甚至整个模块.
* 需要解析的函数(译注:即没有被编译的函数)和编译过的函数可以自由的混合使用.
预编译(Ahead-of-time AOT)也是被支持的:
* 一些API函数和命令行选项允许用户全盘控制编译过程
这个即时编译器是可扩展的:
* 优化器是一个外部模块可以附着在编译器流水线上.
* 一些模块提供了关于编译过程的跟踪和调试信息.
* 所以这些功能可以通过命令行参数来激活.
性能
被编译的机器码是非常高效的:
* 先请看一下性能对比测试
* 在任何可以采用的地方采取了侵入性优化措施(特殊化,内联).内联的约定(contracts)在运行时捕获错误的优化预测(未发现的多态).
* 自适应去优化被用来重新编译那些破坏了约定的字节码指令.这避免了生成普通的低效率的通用代码(更快速编译,减少指令缓存(I-cache)争抢).
* 特殊CPU功能(比如条件转移或SSE2)会自动被检测和使用.
这个JIT编译器是非常的快的:
* 整个JIT编译器只在Lua核心上增加了32K代码(如果采用 -Os 大小优化参数来编译).
* 优化器被分成几个可选的模块,可以在运行时根据需要来加载.
* LuaJIT添加了大约6000行C代码和2000行汇编代码于Lua 5.1 核心(17,000行C代码)
* 依赖的构建工具 (DynASM) 有大约2,500行Lua代码.
兼容性
LuaJIT被设计成全兼容Lua 5.1.她接受同样的源代码和/或预编译字节码.她支持所有标准语言语义.特别是:
* 支持所有标准类型,操作符和元方法.
* 隐式类型强制转换(number/string).
* 完全 IEEE-754 语义浮点算法(NaN, +-Inf, +-0, ...).
* 完全支持词法闭包.正确的尾调用不会消耗栈帧(译注:栈空间).
* 异常是精确的.回溯追踪工作的很好.
* 通过CoCo提供协程支持.(译注:一点兼容性问题 )
* 没有改变Lua 5.1的增量垃圾收集器.
* 没有改变标准Lua/C API.
* 动态加载的C模块保持和Lua 5.1一样链接兼容性(同样的ABI 抽象二进制接口).(译注:基本不用重新编译老的Lua模块,但是仍然偶遇兼容性问题).
* LuaJIT可以像Lua那样嵌入到一个应用程序里.
一些次要的不同点和调试有关:
* 调试钩子只在调试代码生成使能时调用
* 在JIT编译过的代码中不支持尾调用计数.HOOKTAILRET 也不会被调用.注意: 除非你写Lua调试器,否则这些对你没有影响.
限制
* 目前只支持x86(i386+)CPU.
* 只支持缺省的 lua_Number 类型(double).
* 终止信号(Ctrl-C)被忽略.除非你使能调试钩子(用 -j 调试).
但是这会减慢运行速度.我正在找更好的解决办法.与此同时,你可以按两次Ctrl-C来终止一个正在运行的JIT编译过函数(类似C函数).
* GDB,Valgrind 和其它调试工具不能够报告JIT编译后代码的符号和栈.这很难解决.参考 调试LuaJIT .