【Unity】文字列操作によるGC Allocを減らせる「ZString」

DEVELOP, Unity

文字列連結によるメモリ割り当て、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");
}
182バイトのGC Allocが発生しているが…

ZString.concat

void Update()
{
    var str = ZString.Concat("1", "2", "4", "8", "16");
}
ZString.concat だと38バイトとなりGC Alloc を減らすことが出来る。

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# って文字列連結がかなりネックで解決しようと思うと丁寧な対応が必要でしたが、これだと使い勝手も変わらないので導入が楽ですし気が楽です。

Posted by kazupon