ユーザ用ツール

サイト用ツール


benchmark

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
benchmark [2023/01/14 14:08] – [管理人のPC環境] machiaworxbenchmark [2023/06/12 09:43] (現在) – [感想] machiaworx
行 25: 行 25:
  
 フィボナッチ数列の計算速度(開始から終了までにかかった時間)を取得する。 フィボナッチ数列の計算速度(開始から終了までにかかった時間)を取得する。
 +
 VMを実行するため仮想バイトコードに変換するだろうと考え、中でタイマ処理を追加してます。 VMを実行するため仮想バイトコードに変換するだろうと考え、中でタイマ処理を追加してます。
  
行 37: 行 38:
   速度:   速度:
   Lua > Ruby >  Python >= Squirrel(Pythonとの差は微量かも) >>>>>>>>>>>> Miniscript   Lua > Ruby >  Python >= Squirrel(Pythonとの差は微量かも) >>>>>>>>>>>> Miniscript
 +  
 +==== 感想 ====
      
 遅いよMiniscript!(涙 遅いよMiniscript!(涙
行 42: 行 45:
 ただ上記の通り環境によっても変わると思いますし、数値の取り扱いが小数を含む形に固定されてる、変数やリスト・マップの取り扱いがかなり自由である等、仕様上数値計算に特化している言語と比較するとやりづらいところがあるかもしれません。 ただ上記の通り環境によっても変わると思いますし、数値の取り扱いが小数を含む形に固定されてる、変数やリスト・マップの取り扱いがかなり自由である等、仕様上数値計算に特化している言語と比較するとやりづらいところがあるかもしれません。
  
-あとコミュニティの厚みの差がモロに性能に反映されてる気がしないでもない・・・+あとコミュニティの厚みの差がモロに性能に反映されてる気がしないでもない・・・
  
 (コマンドライン版Miniscriptは2019年初出) (コマンドライン版Miniscriptは2019年初出)
 +
 +=== 20230122追記 ===
 +
 +コミュニティでこんな意見あり。
 +
 +  > MiniScript's call overhead is quite high; recursive Fibonacci is pretty much a worst-case for it.
 +  > That's why it's one of the benchmarks in the benchmark suite.
 +
 +まずMiniscript自体のオーバーヘッドが非常に高くて、今回の実装におけるフィボナッチ数列はそのオーバーヘッド高い状態でぶん回すわけだから、そりゃ負荷がべらぼうに高いわなと。(ワーストケースって言ってるし)
 +
 +簡単な対策としては、フィボナッチ数列を組込関数にするか、基本的には再帰呼び出しを避けて書き下すアプローチが一番効率よさそう。
 +
 +----
 +
 +そもそもベンチマークに使ったアルゴリズムは無茶苦茶な量の計算になるので、現実問題としてスクリプト側でやらせるようなやつではないとも考えます。
 +
 +(どういう使い方が最適なのか、方針を立てるというのもベンチマークの目的であると考えますし)
 +
 +日常的なバッチレベルのものだったり他のソフトに投げる程度であれば使うのは有効だけど、Miniscript単体で大量に計算するものだと避けるのは無難って感じだと思います。
 +
 +ただ、その計算もフィボナッチ数列に匹敵するレベルでなければ問題ないのはわかったので、言語使う際の方針を立てやすくなったと考えます。
 +
 +基本方針は以下の通りかと。
 +
 +  * 書き下しレベルの内容や計算量の多くないものであればMiniscriptで行う
 +  * 再帰呼び出し等による大量の計算がスクリプト側で発生する場合、ベース言語側にオフロードできるか検討する
 +
 +管理人のゲーム開発で使う際は以下の基準で利用しています。
 +
 +  * 基本的にはフィボナッチ数列のようにスクリプト上で大量に計算させる処理は避ける(組込関数で実装する等)
 +  * スクリプトを読むオブジェクトのしきい値は50個を基準にする(うちの環境だとEditor上で問題なく動く基準。本来ならもっと動かせると思うしGPU周りの要因もあるけど。)
 +  * 大量のオブジェクトを動かす場合(1000個程度)ベース言語側で対応する
 +
 +実際キャラクターの行動プログラムについてはかなり複雑に書いてますし、多関節アニメとかもプログラムで書いてますが、処理に不足はありません。
  
 === 対策 ===  === 対策 === 
  
-なんとかする方法はあるんでしょうか?一応あるんです。+とは言うものの、上記の計算の時間をなんとか改善する方法はあるんでしょうか?一応あるんです。
  
 言ってしまうとアルゴリズムの改善ですね。 言ってしまうとアルゴリズムの改善ですね。
行 54: 行 91:
 https://rosettacode.org/wiki/Fibonacci_sequence#MiniScript https://rosettacode.org/wiki/Fibonacci_sequence#MiniScript
  
-あと自分も書きましたが同様の方法ですね。+以前に自分も書きましたが同様の方法ですね。
  
 https://machiaworx.net/?p=648 https://machiaworx.net/?p=648
行 62: 行 99:
 (ちなみにこの方法だと1秒もかからずに処理が出力されます) (ちなみにこの方法だと1秒もかからずに処理が出力されます)
  
-==== まず当記事の結論 ====+==== 当記事の結論 ====
  
-Miniscriptは数値計算のベンチマークはとっても遅い。+管理人の環境では、Miniscriptは再帰的な数値計算のベンチマークはとっても遅い。
  
 ただ、アルゴリズムの改造で遅さをカバー可能。 ただ、アルゴリズムの改造で遅さをカバー可能。
  
 (おそらく実装された記法やリスト・マップの柔軟さに重きを置いてるのかなあと思ったりする。Pythonに近い方向性というか) (おそらく実装された記法やリスト・マップの柔軟さに重きを置いてるのかなあと思ったりする。Pythonに近い方向性というか)
 +
  
 ===== ソースコード ===== ===== ソースコード =====
行 136: 行 174:
     return x     return x
   end function   end function
-  tm=time+  tm=time()
   print fib(38)   print fib(38)
   print time()-tm   print time()-tm
  
benchmark.1673672898.txt.gz · 最終更新: 2023/01/14 14:08 by machiaworx