benchmark
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| benchmark [2023/01/22 04:49] – [感想] machiaworx | benchmark [2026/09/23 11:54] (現在) – machiaworx | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ====== ベンチマークその1(フィボナッチ数列の計算) ====== | ====== ベンチマークその1(フィボナッチ数列の計算) ====== | ||
| - | ちょっと意見いただいたのもあり、ベンチマークを適当に書いてみることにしました。 | + | ちょっと意見いただいたのもあり、ベンチマークを適当に書いてみることにしました。\\ |
| + | 2026/ | ||
| ==== 諸注意 ==== | ==== 諸注意 ==== | ||
| 今回の結果は管理人の環境における結果で、他の環境やOSだと変わる要因があるかもしれません。 | 今回の結果は管理人の環境における結果で、他の環境やOSだと変わる要因があるかもしれません。 | ||
| - | |||
| よって、参考程度とお考えください。 | よって、参考程度とお考えください。 | ||
| 行 21: | 行 21: | ||
| * Squirrel3.1stable | * Squirrel3.1stable | ||
| * Miniscript1.5.1 | * Miniscript1.5.1 | ||
| + | * MiniScript2.0-fc1 | ||
| ==== 内容 ==== | ==== 内容 ==== | ||
| 行 35: | 行 36: | ||
| Squirrel: | Squirrel: | ||
| Miniscript: | Miniscript: | ||
| + | MiniScript2: | ||
| 速度: | 速度: | ||
| - | Lua > Ruby > Python >= Squirrel(Pythonとの差は微量かも) >>>>>>>>>>>> | + | Lua > Ruby > Python >= Squirrel(Pythonとの差は微量かも)> |
| | | ||
| ==== 感想 ==== | ==== 感想 ==== | ||
| 行 56: | 行 58: | ||
| > That's why it's one of the benchmarks in the benchmark suite. | > That's why it's one of the benchmarks in the benchmark suite. | ||
| - | まずMiniscript自体のオーバーヘッドが非常に高くて、今回の実装におけるフィボナッチ配列はそのオーバーヘッド高い状態でぶん回すわけだから、そりゃ負荷がべらぼうに高いわなと。(ワーストケースって言ってるし) | + | まずMiniscript自体のオーバーヘッドが非常に高くて、今回の実装におけるフィボナッチ数列はそのオーバーヘッド高い状態でぶん回すわけだから、そりゃ負荷がべらぼうに高いわなと。(ワーストケースって言ってるし) |
| - | 簡単な対策としては、フィボナッチ配列を組込関数にするか、基本的には再帰呼び出しを避けて書き下すアプローチが一番効率よさそう。 | + | 簡単な対策としては、フィボナッチ数列を組込関数にするか、基本的には再帰呼び出しを避けて書き下すアプローチが一番効率よさそう。 |
| - | + | ||
| - | また、そもそものベンチマークに使ったアルゴリズムは無茶苦茶な量の計算になるので、これを本来スクリプト側でやらせるようなやつではないとも考えます。 | + | |
| ---- | ---- | ||
| + | |||
| + | そもそもベンチマークに使ったアルゴリズムは無茶苦茶な量の計算になるので、現実問題としてスクリプト側でやらせるようなやつではないとも考えます。 | ||
| + | |||
| + | (どういう使い方が最適なのか、方針を立てるというのもベンチマークの目的であると考えますし) | ||
| 日常的なバッチレベルのものだったり他のソフトに投げる程度であれば使うのは有効だけど、Miniscript単体で大量に計算するものだと避けるのは無難って感じだと思います。 | 日常的なバッチレベルのものだったり他のソフトに投げる程度であれば使うのは有効だけど、Miniscript単体で大量に計算するものだと避けるのは無難って感じだと思います。 | ||
| - | ただ、その計算もある程度なら問題ないのはわかっているので、言語使う際の方針を立てやすくなったと考えます。 | + | ただ、その計算もフィボナッチ数列に匹敵するレベルでなければ問題ないのはわかったので、言語使う際の方針を立てやすくなったと考えます。 |
| 基本方針は以下の通りかと。 | 基本方針は以下の通りかと。 | ||
| - | * 軽い動作のスクリプトやスクリプト側での計算量の多くないものであればMiniscriptで行う | + | * 書き下しレベルの内容や計算量の多くないものであればMiniscriptで行う |
| - | * 大量の計算が発生する場合、ベース言語側で処理する | + | * 再帰呼び出し等による大量の計算がスクリプト側で発生する場合、ベース言語側にオフロードできるか検討する |
| 管理人のゲーム開発で使う際は以下の基準で利用しています。 | 管理人のゲーム開発で使う際は以下の基準で利用しています。 | ||
| - | * 基本的にはフィボナッチ配列のようにスクリプト上で大量に計算させる処理は避ける(組込関数で実装する等) | + | * 基本的にはフィボナッチ数列のようにスクリプト上で大量に計算させる処理は避ける(組込関数で実装する等) |
| * スクリプトを読むオブジェクトのしきい値は50個を基準にする(うちの環境だとEditor上で問題なく動く基準。本来ならもっと動かせると思うしGPU周りの要因もあるけど。) | * スクリプトを読むオブジェクトのしきい値は50個を基準にする(うちの環境だとEditor上で問題なく動く基準。本来ならもっと動かせると思うしGPU周りの要因もあるけど。) | ||
| * 大量のオブジェクトを動かす場合(1000個程度)ベース言語側で対応する | * 大量のオブジェクトを動かす場合(1000個程度)ベース言語側で対応する | ||
| - | ただ上記であればもう十分という感じではあります。 | + | 実際キャラクターの行動プログラムについてはかなり複雑に書いてますし、多関節アニメとかもプログラムで書いてますが、処理に不足はありません。 |
| === 対策 === | === 対策 === | ||
| - | なんとかする方法はあるんでしょうか?一応あるんです。 | + | とは言うものの、上記の計算の時間をなんとか改善する方法はあるんでしょうか?一応あるんです。 |
| 言ってしまうとアルゴリズムの改善ですね。 | 言ってしまうとアルゴリズムの改善ですね。 | ||
| 行 99: | 行 103: | ||
| ==== 当記事の結論 ==== | ==== 当記事の結論 ==== | ||
| - | 管理人の環境では、Miniscriptは数値計算のベンチマークはとっても遅い。 | + | 管理人の環境では、Miniscriptは再帰的な数値計算のベンチマークはとっても遅い。 |
| ただ、アルゴリズムの改造で遅さをカバー可能。 | ただ、アルゴリズムの改造で遅さをカバー可能。 | ||
| (おそらく実装された記法やリスト・マップの柔軟さに重きを置いてるのかなあと思ったりする。Pythonに近い方向性というか) | (おそらく実装された記法やリスト・マップの柔軟さに重きを置いてるのかなあと思ったりする。Pythonに近い方向性というか) | ||
| + | |||
| ===== ソースコード ===== | ===== ソースコード ===== | ||
| 行 162: | 行 167: | ||
| print(time()-a) | print(time()-a) | ||
| - | ==== Miniscript ==== | + | ==== Miniscript(1と2は共通) |
| fib=function(n=0) | fib=function(n=0) | ||
benchmark.1674330591.txt.gz · 最終更新: 2023/01/22 04:49 by machiaworx