# #74 の Release ベンチマーク再現資材 以下は現環境のパス。別の場所で実行する場合は各コマンド引数の保存先・repository・SwiftPM packagesを置き換える。パスを省略するとこの環境をdefaultに使う。 ```sh python3 generate.py /private/tmp/smp-issues-74 python3 prepare.py /private/tmp/smp-issues-74 /Users/judau/dev/github/log5r/simple-media-player zsh benchmark.sh before /private/tmp/smp-issues-74 /Users/judau/dev/github/log5r/simple-media-player/.build/SourcePackages zsh benchmark.sh after /private/tmp/smp-issues-74 /Users/judau/dev/github/log5r/simple-media-player/.build/SourcePackages ``` `generate.py` はffmpeg・lame・flacで500曲を生成する。`gen-one.sh` は `/opt/homebrew/bin` のツールを使うため、別環境ではその3パスを変更する。 `prepare.py` はrepositoryからbefore/afterのcheckoutコピーを作り、beforeだけStoredMetadataを基準88f559c版へ戻す(第3引数で別refを指定できる)。読取カウンターと旧#65の一時ハーネスを両方へ加える。旧ハーネスは本ディレクトリの `Issue65BulkBenchmarkTests.swift` に保存しており、名前・保存先・versionは生成時に置換する。ハーネスの長大関数に対するfunction_body_lengthだけlintを無効にする。製品コードのlintとbaselineは変更しない。 `benchmark.sh` はReleaseのbuild-for-testing後、件数guard付きのrun_compiled.pyで3回のtest-without-buildingを実行する。ほかの負荷のあるbuild/test/エンコードを終了してから測る。resultsのJSON、各回のログ、測定revisionを保存する。 モデルは未編集のUnknown Artist/Albumで、原本には通常のartist/albumタグがある条件。毎回500曲をコピーし、ディスク上SQLiteストアを新規作成する。更新・失敗件数、500曲すべての新コメント、別ModelContextからの永続化を確認する。 全6回が終わった後、`python3 summarize.py /private/tmp/smp-issues-74` で各回の更新・失敗・永続化件数と読取回数を検証し、各回の時間と中央値を `results/summary.json` にまとめる。 ビルドが完了したsnapshotは `python3 run_compiled.py before ROOT PACKAGES`/`after` で測る。Swift Testing のmethod filterには `bulkCommentEdit500Placeholders()` の括弧を含める。各回、対象1 test/1 suite成功と新規JSON1件を確認し、0件成功を受け付けない。最初の誤ったfilterで0件成功したログは `not-selected-before-*.log` として測定から除外した。 今回の実sourceは基準HEAD88f559cの作業中snapshot。resultsのsource-sha256-before/after.jsonとbinary-sha256.json、repro/instrumentation.patchに内容と計数差分を残した。前後のソース差はStoredMetadataとharnessの版名だけ。実行はbefore3回→after3回の順で、ほかのbuild/test/encode/UI操作を止めた。キャッシュを強制破棄する操作は行わない。 `prepare.py` のbaselineは固定88f559cであり、後の修正commitから実行してもbeforeに今回の修正が混入しない。実測時の全snapshotを保存していないため、完全な同一sourceを再構成するには後の製品commitとsource hashを照合する必要がある。結果の数値を再測定で必ず再現するものではない。 ### test host 起動の範囲に関する補足 測定対象の `LibraryService` と `ModelContainer` は専用temp領域を使用した。一方、この実行のアプリhostには通常の `App.init` が残り、起動時の通常Serviceのpending removal再開/temporary cleanup/永続container初期化を分離していなかった。したがって全プロセスがユーザーデータへアクセスしない構成だったとは主張しない。ここに保存したsource snapshot/hashは、実際に測定した版の記録として変更しない。後続のnative互換fixture hostでは、専用temp Service、inMemory host container、専用bundle IDへ分離した。測定したAPIのtemp fixture/storeと起動hostの設定を区別する。