7

shen-go v0.2发布:从165s优化到11s

 3 years ago
source link: https://www.zenlife.tk/shen-go-v0.2.md
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

shen-go v0.2发布:从165s优化到11s

2018-01-08

刚刚给shen-go打上了v0.2版。从v0.1到v0.2主要做的是一些性能优化相关的事情,分享一些数据。

最早的时候我实现了一个klambda解释器,那时跑shen的测试需要165s完成。

在发布v0.1版的时候,实现了编译到bytecode,跑测试时间大概是25s的样子,从纯的解释器到未优化过的bytecode,大概是快了6倍多。

接着就是v0.1到v0.2版做的事情,前面有提到过

vm的大幅改进,主要是将环境拆成堆上和栈上两部分,尽量地避免在堆上分配对象。加上vm那边一些细节上的优化,这块做了之后时间缩短到了16s。

对hash函数做了 peephole optimizations,时间缩短到15.3s。

接着对variable? integer? 等几个函数做 peephole optimizations 之后,时间缩短到13.9s。

调整了 symbol 的表示,不再是string而直接记一个offset,比较就可以不用string比较。做了这个之后时间是12.5s。

优化了函数调用,从map实现改到了直接数组offset获取,最终是11.6s。

let的优化没做,peephole optimization还可以再彻底一些,感觉得如果做到极致,估计能就刚进10s的样子。

threaded code 和 fixnum tagging 我尝试了一下,在Go语言里面都做不了。如果是换成 C 语言写vm,可以做这些优化,并且内存管理也做的更激进一些,我推测bytecode方式的极限可能在 7-8s。

顺便分享一些 shen 在其它语言下实现的数据。

shen-c 是完全基于解释器实现的,太挫了就不想说它了。

shen-scheme 在 chibi-schem 下的实现,大概是22s的级别。这也是一个字节码实现,还是 C 语言做的,只比我 bytecode 未优化的时候略快一点,也算是挺挫的了。无节操的推测一下可能是scheme的异常处理机制拖累了它。

shen-elisp 是编译到 emacs lisp 的 bytecode,速度大概在30秒刚出头。elisp 不算一门正儿八经的编程语言啦。

shen-jvm 是直接编译到 JVM 的,速度大概在 4.几秒的样子。

shen-cl 官方维护的版本,通过 common lisp 编译到 native 的实现,速度大概也是同样量级,4.5s。比 shen-jvm 慢一点点。

shen-chez,这就是王垠说的世界上最牛的编译器,1.6s!还真是一个秒天秒地的版本,我算是领教了。

F#看论坛上给的结果,好像都是10几秒的版本吧,Truffle 好像更慢一点。我没具体去测。不过如果编译到某个平台的虚拟机,比如.Net或者Graal,这结果还真是挺挫的。

结论就是,bytecode大概就10-20s的量级了,做得非常有节操会进10s内。而JVM虚拟机这种带了JIT或者common lisp到native的大概就4s的级别。最牛B的chez吊打其它。

shen-go 在基于 bytecode 实现里面已经最快的了。基本做不下去。弃坑弃坑

供参考,以上。

(最后,数据都有时效性,只是当下的比较,说不定哪个升级下变牛逼了,就不准确了。

所以嘛,想知道准确的性能测试结果,这东西最好自己做)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK