v8のビルド方法とTraceMonkeyとの比較など
gcc-4.3では"Explicit template specialization cannot have a storage class"エラーが出るので、
CXX=g++-4.2 scons
でビルドできる
$ svn co http://v8.googlecode.com/svn/trunk/ v8 $ cd v8 $ CXX=g++-4.2 scons sample=shell $ cd .. $ cp v8/shell .
おまけ: TraceMonkeyのjsのビルド
やり方は以前のSpiderMonkeyと同じ。Mercurialはサブディレクトリだけを引っ張ることはできないので、hg cloneは時間がかかるけど。
$ hg clone http://hg.mozilla.org/tracemonkey $ cd tracemonkey/js/src $ make -f Makefile.ref BUILD_OPT=1 ENABLE_JIT=1 $ cd ../../ $ cp tracemonkey/js/src/Linux_All_OPT.OBJ/js .
ソース内にv8ディレクトリある。。。ベンチマークスクリプトっぽい。
双方、動かしてみた。
ベンチマーク比較
$ ../Linux_All_OPT.OBJ/js run.js #tracemonkey Richards: 152 DeltaBlue: 170 Crypto: 163 RayTrace: 202 EarleyBoyer: 370 ---- Score: 199
$ ../shell run.js # v8 Richards: 2484 DeltaBlue: 2330 Crypto: 1602 RayTrace: 1419 EarleyBoyer: 2688 ---- Score: 2040
うーむ。この桁の違いは。。。
参考: spidermonkey js-1.7
$ js -v JavaScript-C 1.7.0 2007-10-03 usage: js [-PswWxCi] [-b branchlimit] [-c stackchunksize] [-v version] [-f scriptfile] [-e script] [-S maxstacksize] [scriptfile] [scriptarg...] $ js run.js Richards: 116 DeltaBlue: 117 Crypto: 122 RayTrace: 137 EarleyBoyer: 133 ---- Score: 125
rhino 1.7
$ rhino Rhino 1.7 release 1 2008 07 31 > $ rhino run.js Richards: 7 DeltaBlue: 111 Crypto: 151 RayTrace: 304 EarleyBoyer: 314 ---- Score: 101
javascript-1.8の for in
tracemonkey版jsは1.8.0らしい。テストによれば、1.8ではgeneratorでfor inループが使えるっぽい。
$ ./js -v JavaScript-C 1.8.0 pre-release 1 2007-10-03 usage: js [-zKPswWxCi] [-b branchlimit] [-c stackchunksize] [-o option] [-v version] [-f scriptfile] [-e script] [-S maxstacksize] [scriptfile] [scriptarg...]
firefox3と一緒?最新版じゃなかったか
for-inの例
a = [1,2,3,4,5]; for (let i in a) { print(i + ": " + a[i]); }
結果
0: 1 1: 2 2: 3 3: 4 4: 5
こうかける
a = [1,2,3,4,5]; for (let [k,v] in Iterator(a)) { print(k + " : " + v); }
一般のgeneratorも使える
gf = function () { for (let i = 0; i < 5; i += 1) { yield i * 100; } }; for (let i in gf()) { print(i); }
結果
0 100 200 300 400