Haskell コードのベンチマークに基準を使用しています。ランダムなデータが必要な重い計算を行っています。メインのベンチマーク ファイルを次のように記述しました。
main :: IO ()
main = newStdGen >>= defaultMain . benchmarks
benchmarks :: RandomGen g => g -> [Benchmark]
benchmarks gen =
[
bgroup "Group"
[
bench "MyFun" $ nf benchFun (dataFun gen)
]
]
それらのベンチマークとデータジェネレーターをさまざまなモジュールに保持しています。
benchFun :: ([Double], [Double]) -> [Double]
benchFun (ls, sig) = fun ls sig
dataFun :: RandomGen g => g -> ([Double], [Double])
dataFun gen = (take 5 $ randoms gen, take 1024 $ randoms gen)
これは機能しますが、2 つの懸念事項があります。まず、ランダム データの生成に必要な時間はベンチマークに含まれていますか? その件に関する質問を見つけましたが、正直なところ、それを自分のコードに適用することはできません。これが発生するかどうかを確認するために、IO モナド内に含まれる別のバージョンのデータ ジェネレーターを作成しました。ジェネレーターと呼ばれる main でベンチマーク リストを配置し、<- で結果を抽出してから、ベンチマーク関数に渡しました。パフォーマンスに違いは見られませんでした。
2 つ目の懸念事項は、ランダム データの生成に関するものです。現在、一度作成されたジェネレーターは更新されていないため、1 回の実行で同じデータが生成されます。これは大きな問題ではありませんが、それでも適切に作成するとよいでしょう。各 data* 関数内で異なるランダム データを生成する適切な方法はありますか? 「Neat」とは、「IO内でStdGenを取得するデータ関数を作成しない」ことを意味しますか?
編集:以下のコメントで述べたように、データのランダム性についてはあまり気にしません。私にとって重要なのは、データの生成に必要な時間がベンチマークに含まれていないことです。