正確なマイクロベンチマークを実行しようとするRust開発者は、Criterionのような標準的なツールには、Goのエコシステムで一般的な特定の機能が欠けていることに気づくことがよくあります。具体的には、Criterionはヒープ割り当て(B/op)をネイティブに追跡できず、標準的なpprofプロファイリング統合を欠いており、マイクロ秒レベルのループにおいて分散やオーバーヘッドを導入する可能性のある線形ランプサンプリングモデルを使用しています。これらの制限により、RustとGoの実装間での直接的なA/B比較や、異なるコミット間でのメモリチャーンの退行を追跡することが困難になっています。

このギャップを埋めるために、Bartek Płotkaは、ゼロ依存のRustベンチマークランナーおよびCriterionコンバーターであるbenchfmt.rsを開発しました。このツールは、スレッドローカルなヒープ割り当てカウンター(CountingAlloc)とpprofプロファイラー統合を提供することで、Goの`testing.B`フレームワークを模倣します。また、`/key=value`形式のサブベンチマーク命名をサポートしており、これによりGoベースの`benchstat`ツールを使用して、言語やサンプルサイズなどの異なる次元にピボット(軸の切り替え)することが可能になります。既存のプロジェクトに対しては、コンバーターがCriterionの出力を取得してGo互換の`benchfmt`形式で出力することができ、外れ値に強い中央値計算やMann-Whitney Uテストを行うための`benchstat`の使用を可能にします。

Goのベンチマークワークフローとの統合を示すbenchfmt.rsプロジェクトのプロモーショングラフィック。
benchfmt.rsプロジェクトは、GoスタイルのベンチマークテレメトリをRustエコシステムにもたらすことを目指しています。www.bwplotka.dev

この画像は、Rust開発者のためにGoのベンチマークエコシステムを再現するbenchfmt.rsツールの主要なビジュアルです。

このツールは、ユーザーのニーズに応じて異なるパスを提供します。`benchfmt::Suite`ランナーは、正確なヒープおよびプロファイルデータが必要な新しいマイクロベンチマークを意図しており、スコープ化された`-cpuprofile`および`-memprofile`ファイルをキャプチャします。対照的に、`benchfmt` CLIコンバーターは、すでにCriterionを使用しており、基礎となるベンチマークコードを変更せずに`benchstat`テーブルを生成するだけでよいリポジトリに最適です。Criterionは組み込みのHTMLおよびSVGプロットの標準であり続けますが、benchfmt.rsは、高精度なパフォーマンスエンジニアリングに必要な、操作ごとのヒープバイト数や割り当て数などの特定のテレメトリを提供します。

技術的な相違点の一つはサンプリングモデルです。Criterionはデフォルトで100の線形ランプサンプルを使用しますが、これは分散を増大させ、タイミングのオーバーヘッドを追加する可能性があります。対照的に、benchfmt.rsはGoの定常状態エポックを模倣しており、そこでは固定された反復数が特定の時間枠(例:2秒)に合わせて調整され、独立した実行にわたって繰り返されます。これにより、タイマーのオーバーヘッドによる干渉が結果を歪めてしまうような非常に高速な操作において、より信頼性の高い結果が得られます。ただし、コンバーターはCriterionのサンプル配列をバケット化することでこれらのエポックを近似するため、結果は定常状態モデルの近似であり、Goの内部ランタイム動作の完全な複製ではありません。