というシチュエーションのメモ。
StringBuilder
なら掛かっても2~3秒で終わる処理が、ZString
だと1分ほどかかる状態に。
生成したデータ
- 約15MB、380,000行前後のテキストデータ
- 50文字(アルファベットUTF8、50bytes?)以下の細かい
Append
が大半。 - 各 Append 処理の実行間隔は一瞬。
-
Utf8ValueStringBuilder
/Utf16ValueStringBuilder
を使っている。 - ファイルの内容的にディスクに直で書き出せば?? て感じだが、
- 単体でファイルを書き出すこともあれば、
- 複数ファイルをまとめたアーカイブのみを書き出したい(一時ファイルは作りたくない)
- なので一旦メモリに。
※インスタンスが多くてもそれぞれが軽いデータ量だと StringBuilder
と同等の処理速度が出る。
環境
- Unity
2021.3
- ZString
2.5.0
-
System.Runtime.CompilerServices.Unsafe.dll
は他との兼ね合いでZString
リポジトリのものとは別のバージョンを使用。(多分 .NET Framework 4.6 系) - リポジトリの
Unsafe.dll
(.NET 6 系?)を使ったところで変わらず。
-
- エディター。
- ビルドはしてない。
処理内容
-
ref
でUtf8ValueStringBuilder
を引き回してる。 -
IDisposable
クラスのコンストラクタでCreateUtf8StringBuilder
して、後にクラスのDispose
内でDispose
。クラスはusing
。 -
ファイルの行数の2倍~程度の回数の
Append
(80万回程度?) -
文字列連結やフォーマットはほぼしていない。
-
static void AppendWrapper(ref sb, params object[])
=>foreach...switch { case byte[] ba:...; case bool b:...; case etc:...; }
て感じ。
-
-
極々々々一部で1MB~程度のバイト列を一気に書き込む。
- 64KiB毎に分けて
Append
してみたりもした ← 変わらず。- 64k??? 👇
-
CreateStringBuilder
andCreateUtf8StringBuilder
must use withusing
. Because their builder rent 64K buffer fromArrayPool
. If not return buffer, allocate 64K buffer when string builder is created.
- 64KiB毎に分けて
速度比較のグラフも simple string + int concatenation
だし、64KB 以下のテキスト、"MOJI" + "RETSU" + 10
や string.Format(...)
の置き換えがメインのライブラリでしょう。Utf8ValueStringBuilder
はおまけ。多分ね。
GCの負担が無視できないデバイス向けアプリで、ログ出力・UI向け文字列操作が大量にある場合や using var sb = Utf8ValueStringBuilder
で見える範囲で収まる利用ではない場合には気を付けたい。
--
以上です。お疲れ様でした。