【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
  1. `a`の型をチェック -> int型
  2. `b`の型をチェック -> int型
  3. int型の加算処理を実行
  1. int型の加算処理を実行

実行時に型チェックが不要になるので、これは速くなりそうですね!

また関数の呼び出し側も明示的に型付けされていれば、引数の型チェックが不要になるためこれも速くなるとのことです。

実測

本当に速くなったのか、実際に計測してみました。 (参考記事も2年前ですし…)

計測環境

計測マシン

使用エンジン

  • Godot3: Godot_v3.5.1-stable_win64.exe
  • Godot4: Godot_v4.0-beta7_win64.exe

計測結果

種類 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