実行で証明!Rustコードが本当に $O(n\log n)$ か確かめる方法
bigoish は、関数の実行時間データから「どの計算量モデルが最も当てはまるか」を統計的に判定するRust向けテストライブラリです。期待するモデルが実際に最良フィットかを自動判定します。
実装したアルゴリズムが理論どおりにスケールしているかはバグ発見やパフォーマンス保証に直結します。特に日本のプロダクトでは、大量データやリアルタイム処理での挙動確認が重要です。本ツールはテストに組み込めるためCIでの防衛線になります。
assert_best_fit(expected_model, func, inputs)。期待モデルが最良でなければテストはパニックします。growing_inputs(start, maker, count) で指数的に増える入力列を作れます。BIGOISH_TIME_ONLY=1 で常にCPU時刻に固定できます。cargo test はデフォルトで test プロファイル(最適化弱め)で動くため、最適化によるスケーリング差がある場合は --release でテストを走らせるか、#[cfg(not(debug_assertions))] を使ってリリース時のみチェックしてください。NO_COLORS や TERM=dumb を設定して無効化可能です。Model 実装を組み合わせて新モデルを作ることもできます。例(要旨):
// rust
use bigoish::{N, Log, assert_best_fit, growing_inputs};
fn sort(mut v: Vec<i64>) -> Vec<i64> { v.sort(); v }
fn make_vec(n: usize) -> Vec<i64> {
use fastrand;
std::iter::repeat_with(|| fastrand::i64(..)).take(n).collect()
}
// n * log(n) が最良フィットかを確認
assert_best_fit(N * Log(N), sort, growing_inputs(10, make_vec, 25));
cargo test --release で行い、コンパイラ最適化後の振る舞いを確認する。BIGOISH_TIME_ONLY=1 を検討。以上を取り入れれば、実装が本当に期待どおりスケールしているかを自動テストで守れるようになります。