asm.jsを試す

Firefoxで実装されているというasm.jsを試しました。これはJavaScriptのプログラムのうち、一部を非常に制限されたルールにしたがって書いてそこに"use asm"というディレクティブをつければ、その部分が非常に高速化されるというしろものです。

以前、「メルセンヌツイスタにおいて与えるseedを0から1000000まで変化させ、それぞれのseedで一番目の乱数を得る」というプログラムでいろんな言語のベンチマークをとりました。
これは要するに32bit整数の演算ばっかりをたくさんやるけれど、配列参照などはまったくしないプログラムです。

このベンチマークをasm.jsに対してもやってみました。

結果:

  • 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

筆者: oupo (連絡先: oupo.nejiki@gmail.com)