【Godot】Godot4のGDScriptはどれくらい速くなったのか?
Godot Engine Advent Calendar 2022 7日目の記事になります。
結論
Godot4はGodot3と比較して、GDScriptはだいぶ速くなりました。
解説
参考URL
だいたいこちらに書かれています。
https://godotengine.org/article/gdscript-progress-report-typed-instructions
要約
上記の記事を要約しますと、GDScriptの実行エンジンに型付けされた命令を実装されましたということです。
次の処理内容が高速化されたとのことです。
| 高速化内容 | 高速化率 |
|---|---|
| 計算命令 (+や&など) | 約25-50% |
| 配列の添え字(array[index])アクセス | 約5-7% |
| 組込型の関数(array.resize(n)等)呼び出し | 約70% |
| ネイティブクラスの関数の呼び出し | 約120-150% |
| 組込み関数(absやrandf等)の呼び出し | 約25〜50% |
| イテレーション(for-inループ) | 約10~50% |
詳細な解説
GDScriptエンジンに型付けされた命令が実装されると何が嬉しいかを解説します。
例えばこのようなGDScriptコードがあったとします。
func add(a: int, b: int) -> int: return a + b
変数(引数)aと'b'はint型と明示されていますが、Godot3ではコンパイル時にチェックが走るだけで、実行時は動的型の変数として処理されていました。
Godot4ではこれらが実行時もint型の変数として確定した前提で処理されるようになります。
上記では+演算子の処理内容が次のように異なってきます。
| Godot3 | Godot4 |
|---|---|
|
|
実行時に型チェックが不要になるので、これは速くなりそうですね!
また関数の呼び出し側も明示的に型付けされていれば、引数の型チェックが不要になるためこれも速くなるとのことです。
実測
本当に速くなったのか、実際に計測してみました。 (参考記事も2年前ですし…)
計測環境
計測マシン
使用エンジン
計測結果
| 種類 | Godot3.5.1 | Godot4.0.beta7 | 高速化率 |
|---|---|---|---|
| int演算 | 52580 | 30462 | 72.608 |
| float演算 | 48105 | 27786 | 73.127 |
| 配列アクセス | 51241 | 42845 | 19.596 |
| 組込み関数 | 130234 | 99035 | 31.503 |
| 組込み型の関数 | 78387 | 54279 | 44.415 |
| ネイティブクラスの関数 | 169966 | 25432 | 568.316 |
| スクリプトの関数 | 308276 | 129272 | 138.471 |
| スクリプトクラスの関数 | 206974 | 95454 | 116.831 |
| フィボナッチ数列の生成 | 1323376 | 633049 | 109.048 |
ネイティブクラスの関数呼び出しがえぐいくらい速くなっていることを除いて、前述の高速化内容と概ね一致してそうです。
計測コード
https://gist.github.com/ueshita/7d60a47574113c8e5c1b262f36726a9a
追記 (2023/1/13)
Godot4.0.beta11がリリースされました。 アップデート内容にGDScript関連の多くの改善と最適化が入ったようです。
Many improvements, fixes, and optimizations have been done to GDScript and its runtime environment (GH-62688, GH-64253, GH-69590, GH-69991, GH-70246, GH-70464, GH-70613, GH-70655, GH-70658, GH-70702, GH-70838, GH-70859, GH-71051, GH-71107, and more).
というわけで、同条件でベンチマークを取り直してみました。
| 種類 | Godot4.0.beta7 | Godot4.0.beta11 | 高速化率 |
|---|---|---|---|
| int演算 | 30462 | 23086 | 131.95 |
| float演算 | 27786 | 17040 | 163.06 |
| 配列アクセス | 42845 | 39787 | 107.69 |
| 組込み関数 | 99035 | 81489 | 121.53 |
| 組込み型の関数 | 54279 | 53841 | 100.81 |
| ネイティブクラスの関数 | 25432 | 23369 | 108.83 |
| スクリプトの関数 | 129272 | 130316 | 99.20 |
| スクリプトクラスの関数 | 206974 | 92584 | 103.10 |
| フィボナッチ数列の生成 | 1323376 | 661419 | 95.71 |