LoginSignup
1
0

More than 1 year has passed since last update.

ZString を使うとむしろ処理が遅くなる

Last updated at Posted at 2023-01-12

というシチュエーションのメモ。

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 系?)を使ったところで変わらず。
  • エディター。
  • ビルドはしてない。

処理内容

  • refUtf8ValueStringBuilder を引き回してる。

  • 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 and CreateUtf8StringBuilder must use with using. Because their builder rent 64K buffer from ArrayPool. If not return buffer, allocate 64K buffer when string builder is created.


速度比較のグラフsimple string + int concatenation だし、64KB 以下のテキスト、"MOJI" + "RETSU" + 10string.Format(...) の置き換えがメインのライブラリでしょう。Utf8ValueStringBuilder はおまけ。多分ね。

GCの負担が無視できないデバイス向けアプリで、ログ出力・UI向け文字列操作が大量にある場合や using var sb = Utf8ValueStringBuilder で見える範囲で収まる利用ではない場合には気を付けたい。

--

以上です。お疲れ様でした。

1
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0