asm.jsを試す
Firefoxで実装されているというasm.jsを試しました。これはJavaScriptのプログラムのうち、一部を非常に制限されたルールにしたがって書いてそこに"use asm"というディレクティブをつければ、その部分が非常に高速化されるというしろものです。
以前、「メルセンヌツイスタにおいて与えるseedを0から1000000まで変化させ、それぞれのseedで一番目の乱数を得る」というプログラムでいろんな言語のベンチマークをとりました。
これは要するに32bit整数の演算ばっかりをたくさんやるけれど、配列参照などはまったくしないプログラムです。
このベンチマークをasm.jsに対してもやってみました。
- http://oupo.github.io/tmp/mt-benchmark-use-asm.html
- http://oupo.github.io/tmp/mt-benchmark-no-use-asm.html
結果:
- use asm: 1773 msec
- no use asm: 987 msec
あれ?あれれれれ。"use asm"を無効にした方が高速になっています…。
しかも…
>cl.exe -Ox mt-benchmark.c Microsoft(R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86 Copyright (C) Microsoft Corporation. All rights reserved. mt-benchmark.c Microsoft (R) Incremental Linker Version 12.00.21005.1 Copyright (C) Microsoft Corporation. All rights reserved. /out:mt-benchmark.exe mt-benchmark.obj >type time.rb t = Time.now system *ARGV puts "#{Time.now - t} sec." >ruby time.rb .\mt-benchmark.exe 232881862 0.968796 sec
ということなので、"use asm"なしはCと遜色のない速度で動いています。(C版の時間はプロセス起動と終了まで含まれてしまっているとはいえ)
これは二重に驚きの結果です。
環境: Firefox 27.0.1