ユーザ用ツール

サイト用ツール


benchmark

文書の過去の版を表示しています。


ベンチマークその1(フィボナッチ数列の計算)

ちょっと意見いただいたのもあり、ベンチマークを適当に書いてみることにしました。

諸注意

今回の結果は管理人の環境における結果で、他の環境やOSだと変わる要因があるかもしれません。

よって、参考程度とお考えください。

管理人のPC環境

  • CPU:Intel Core i5-6400
  • メモリ:16GB

候補

  • Lua5.4.4
  • Python3.9.8
  • Ruby3.2.9
  • Squirrel3.1stable
  • Miniscript1.5.1

内容

フィボナッチ数列の計算速度(開始から終了までにかかった時間)を取得する。

VMを実行するため仮想バイトコードに変換するだろうと考え、中でタイマ処理を追加してます。

結果

Lua:4.444sec
Python:12.4836sec
Ruby:4.95057sec
Squirrel:13sec(ms単位で計測できない)
Miniscript:計測不能(結果が帰ってこない)
速度:
Lua > Ruby >  Python >= Squirrel(Pythonとの差は微量かも) >>>>>>>>>>>> Miniscript

遅いよMiniscript!(涙

ただ上記の通り環境によっても変わると思いますし、数値の取り扱いが小数を含む形に固定されてる、変数やリスト・マップの取り扱いがかなり自由である等、仕様上数値計算に特化している言語と比較するとやりづらいところがあるかもしれません。

あとはコミュニティの厚みの差がモロに性能に反映されてる気がしないでもない・・・

(コマンドライン版Miniscriptは2019年初出)

対策

なんとかする方法はあるんでしょうか?一応あるんです。

言ってしまうとアルゴリズムの改善ですね。

https://rosettacode.org/wiki/Fibonacci_sequence#MiniScript

あと自分も書きましたが同様の方法ですね。

https://machiaworx.net/?p=648

こんな感じでアルゴリズム上でなんとかしていく正統派なアプローチが必要になってきます。

(ちなみにこの方法だと1秒もかからずに処理が出力されます)

まず当記事の結論

Miniscriptは数値計算のベンチマークはとっても遅い。

ただ、アルゴリズムの改造で遅さをカバー可能。

(おそらく実装された記法やリスト・マップの柔軟さに重きを置いてるのかなあと思ったりする。Pythonに近い方向性というか)

ソースコード

参考資料

Lua

function fib(n)
  if n < 2 then return n end
  return fib(n - 2) + fib(n - 1)
end
x = os.clock()
print(fib(38))
print (os.clock() - x)

python

import time
def fib(n):
  if n < 2: return n
  return fib(n - 2) + fib(n - 1)
start = time.perf_counter()
print(fib(38))
print(time.perf_counter() - start)

Ruby

require 'benchmark'
def fib(n)
  return n if (n < 2)
  return fib(n - 2) + fib(n - 1)
end
result = Benchmark.realtime do
  puts fib(38)
end
puts "sec #{result}s"

Squirrel

function fib(n)
{
  if (n < 2)
      return n;
  else
      return fib(n - 2) + fib(n - 1);
}
local a=time()
print(fib(38).tostring() + "\n");
print(time()-a)

Miniscript

fib=function(n=0)
  if n<2 then
    return n
  end if
  x =fib(n-2) + fib(n-1)
  return x
end function
tm=time
print fib(38)
print time()-tm
benchmark.1673672921.txt.gz · 最終更新: 2023/01/14 14:08 by machiaworx