kiyokaのブログアーカイブ

Archive of old blog posts

Nendoのベンチマークを開始

img Nendoで書いたプログラムがPure rubyと比べてどれくらい遅いかを調べ始めた。 まずは最初の結果を示そう。 竹内関数の処理時間は以下の通り。 ※ 引数は tak( 10, 5, 0 ) Ruby 0.03秒 Nendo 38.89秒 その差 およそ1296倍。スゲー。

ソースコードは以下の通り。コーディングの仕方でどちらかが有利になるようなことはないだろう。 Ruby

  def tak( x, y, z )
    if y >= x
      y
    else
      tak( tak( x-1, y, z ),
           tak( y-1, z, x ),
           tak( z-1, x, y ))
    end
  end

Nendo

(define (tak x y z)
  (if (>= y x)
      y
      (tak (tak (- x 1) y z)
           (tak (- y 1) z x)
           (tak (- z 1) x y))))

まず、何から手を付けるか。 takは関数呼び出しが全て固定長なので、Nendoの引数の渡しかたを固定長の場合だけ最適化するだけで相当高速化するハズ。とういか以前、Nendoの出力したRubyコードを手で最適化した際にかなり効果があったので、その案を進めてみる。 難しい箇所としては、既にNendoに組込んである末尾再帰最適化を壊さないように今回の仕組みを入れないといけないところ。 2日程度で作業完了できればいいのだけどなぁ。そんなに簡単ではないんだろうなぁ。