ES-BASIC #7
(9) ベンチマーク
- ES-BASICが他の言語と比べてどのくらい速いのか、もしくはどのくらい遅いのかを比べてみようと思って、どんなプログラムで比較したらいいのかを考えてみました。
- それで世間の人はどんなプログラムで比較しているのかなと思って調べてみたら、以下のようなものがありました。
- [1]再帰を使いまくってfibo(42)を計算する。
- [2]あえて収束の悪い級数を使って(arctan(1)の級数展開)、円周率を計算する。
- [3]単純な10億回ループ。
- [4]自然数を与えたときに、その平方根までの奇数で割り算して余りを出す方法で、素数かどうかを判定する関数を書き、その関数を使ってかなり大きな数まで素数かどうかを判定する。
- これらのベンチマークは以下の問題があると思いました。
- [1]フィボナッチ数を計算するのなら、普通は再帰なんか使わずに漸化式を使って計算する。そのほうが何億倍も速い。あえて極端に遅いアルゴリズムを選んで、それで優劣を決めるのは実際の性能を反映しているだろうか?フィボナッチ数を再帰で計算しようとすれば、それは相当な回数の関数呼び出しが発生するのだが、それはもはや関数呼び出し命令のベンチマークにしかなっていない気がする。普通のプログラムはそこまで関数呼び出しばかりするわけではなく、他の演算の性能のほうがずっと重要だと思う。
- [2]普通、円周率を計算するのには、もっと収束の速い級数を使うので、このベンチマークも意味がない。プログラミング言語の作者は、アホなアルゴリズムで性能が出るかどうかは正直どうでもいいだろう。それよりも実際的なアルゴリズムでの性能を考えて言語設計をしたに違いない。力士を集めて優劣をつける時に、なぜ将棋で競わなければいけないのか。相撲でやればいいではないか。だから、あえてダメなアルゴリズムを持ってきて、それでベンチマークを取るのは有意義ではないと思う。
- [3]単純10億回ループは、まあ最速なアルゴリズムではあると思うが、しかしループの中で何もしないのなら、そもそもループする必要がないと思うので、やはり不自然だ。10億回やらなければいけない処理があって、それで10億回ループしているのなら何の問題もないのだが・・・。
- [4]単に素数探しをしたいだけなら、エラトステネスのふるいのアルゴリズムを使うのが普通だし、そのほうが何倍も速い。だからこれもベンチマークとしては適切ではないと思う。
- ということで、まともなアルゴリズムを使っているのにそれなりに処理時間がかかるような処理を探さなければいけないわけです。・・・ということで、マンデルブロ集合の計算かなと思いました。せっかく計算してもグラフィック描画ができないと表示できないのですが、そうするとグラフィックができない言語ではテストできなくなってしまうので、プログラムを改造して、画像の表示はしないことにして、でも演算結果のハッシュ値を計算してprintすることにします。そうでないと、ちゃんと計算できているのかどうかがわからないので。
こめんと欄