【Unity】文字列操作によるGC Allocを減らせる「ZString」
文字列連結によるメモリ割り当て、GC Allocを抑えることが出来るZStringを試してみました。
目次
ダウンロード先
Cysharp/ZString: Zero Allocation StringBuilder for .NET Core and Unity.
使い方
ダウンロードしたファイルを展開し、ZString.Unity.unitypackage を取り込む。これだけです。
string.concat で比較
通常の string.concat
void Update()
{
var str = string.Concat("1", "2", "4", "8", "16");
}
ZString.concat
void Update()
{
var str = ZString.Concat("1", "2", "4", "8", "16");
}
string.format で比較
通常の string.Format
void Update()
{
var str = string.Format("{0}年/{1}月/{2}日", 2020, 2, 28);
}
GC Alloc が202 byte発生しています。
ZString.Format
void Update()
{
var str = ZString.Format("{0}年/{1}月/{2}日", 2020, 2, 28);
}
ZString の方は50byteと通常と比べてGC Alloc が減っています。
StringBuilder で比較
ZStringにはStringBuilder と似た構成のクラスも用意されていますので比較してみました。
通常のStringBuilder
void Update()
{
var sb = new StringBuilder();
sb.Append("foo");
sb.AppendFormat("{0} {1:.###}", "bar", 123.456789);
var str = sb.ToString();
}
0.8KBと結構大きいGC Alloc となっています。
ZStringのStringBuilder
void Update()
{
using (var sb = ZString.CreateStringBuilder())
{
sb.Append("foo");
sb.AppendFormat("{0} {1:.###}", "bar", 123.456789);
var str = sb.ToString();
}
}
54byte! 通常のStringBuilderと比べてかなり減りました。
まとめ
お手軽にGC Allocを減らしたいなら使った方が良いと感じました。C# って文字列連結がかなりネックで解決しようと思うと丁寧な対応が必要でしたが、これだと使い勝手も変わらないので導入が楽ですし気が楽です。