自然対数の底を求める


shinh さんanarchy golf に、自然対数の底を小数点以下 100 桁までを出力するコーナー(?)があるのですが、ちゃんと求めようとすると(もちろん、ゴルファとして、この時点ですでに考え方が間違っているというのはおいておくとして…)どうしてもタイムアウトしてしまう。もしかしたら GNU Smalltalk って(処理によっては)むちゃくちゃ遅い?


…と気になったので、次のようななんのヒネリもない(かつ、どちらでも評価可能な)コードを書いて、その実行速度を測ることで SqueakSmalltalk と比べてみました。

Time millisecondsToRun: [
   ((1 to: 1e2) inject: 1 into: [:e :i | e + (1 / i factorial)]) asScaledDecimal: 100]
Squeak Smalltalk
=> 117
GNU Smalltalk
=> 13743


がーん。遅っ!


追記

その後、GNU Smalltalk のプロジェクト管理者である Paolo Bonzini さんより、わざわざ直接コメントをいただきました。どうやら、このエントリーを書いたときに試した GNU Smalltalk 処理系では、何らかの理由で Smalltalk で書かれたナイーブな無限倍精度整数が処理に使われていたのが原因だったようです。その後インストールし直した最新版の GNU Smalltalk(2.3.3)では、OS X、Win(cygwin)ともに、このような極端なパフォーマンスダウンは認められませんでした(むしろ Squeak の三倍近く高速でした)。以上、念のため。