本日は .NET Framework の小ネタ枠です。
StringBuilder を使って Unity の Update 関数内の文字列処理を効率的に行う方法です。
StringBuilder
string クラスで文字列を行う場合、文字操作を何度も繰り返すとパフォーマンスが著しく低下する可能性があります。
Unity の Update 関数内など短い間隔で複数の文字処理を繰り返すケースでは StringBuilder を利用することでパフォーマンスの向上が期待できます。
docs.microsoft.com
パフォーマンス比較
以下の通り、それぞれ string または StringBuilder を使って Unity の Update 関数内で同じデバッグログの文字列を出力するサンプルスクリプトを作成しました。
再生開始から 5 秒間のみデバッグログの出力を動作させて、デバッグログの出力回数を比較してみます。
string の場合
・StringDebugLog.cs
using UnityEngine; public class StringDebugLog : MonoBehaviour { private float timeout = 5.0f; void Update() { if (Time.time > timeout) return; string stringText = ""; stringText += "LogMessage : "; for (int index = 0; index < 10000; index++) { stringText += $",{index}"; } Debug.Log(stringText); } }
5 秒間でのデバッグログの出力回数は 16 回でした。
StringBuilder の場合
・StringBuilderDebugLog.cs
using System.Text; using UnityEngine; public class StringBuilderDebugLog : MonoBehaviour { private float timeout = 5.0f; void Update() { if (Time.time > timeout) return; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("LogMessage : "); for (int index = 0; index < 10000; index++) { stringBuilder.Append($",{index}"); } Debug.Log(stringBuilder.ToString()); } }
5 秒間でのデバッグログの出力回数は 136 回でした。
結果、StringBuilder を使った方が文字列処理のパフォーマンスが高くなっていることが確認できました。