プログラムが 12.9MB の.wav
ファイルをメモリに読み込むのにかかる時間を知りたいです。ファイルをメモリに読み込む関数は次のようになります。
import qualified Data.ByteString as BS
getSamplesFromFileAsBS :: FilePath -> IO (BS.ByteString)
ファイルの名前を取得し、サンプルをByteString
. また、データに対してその他の有効性チェックを実行し、ヘッダー情報を無視します。ByteString
を使用してサンプルの をメモリに読み込みましたByteString.hGet
。
この関数を 12.9MB のファイルでベンチマークすると、次のようになりますCriterion
。
bencher :: FilePath -> IO ()
bencher fp = defaultMain [
bench "Reading all the samples from a file." $ nfIO (getSamplesFromFileAsBS fp)
]
次の結果が得られます。
benchmarking Reading all the samples from a file.
time 3.617 ms (3.520 ms .. 3.730 ms)
0.989 R² (0.981 R² .. 0.994 R²)
mean 3.760 ms (3.662 ms .. 3.875 ms)
std dev 354.0 μs (259.9 μs .. 552.5 μs)
variance introduced by outliers: 62% (severely inflated)
3.617ms で 12.9MB をメモリにロードするようです。これは、私の SSD が 3+GB/s を読み取ることができることを示しているため、現実的ではないように思われますが、これはまったく当てはまりません。私は何を間違っていますか?
時間差を手動で測定することにより、これを別の(より単純な)方法で試すことにしました。
runBenchmarks :: FilePath -> IO ()
runBenchmarks fp = do
start <- getCurrentTime
samplesBS <- getSamplesFromFileAsBS fp
end <- samplesBS `deepseq` getCurrentTime
print (diffUTCTime end start)
これにより、次の結果が得られます: 0.023105s。私のSSDが約600MB /秒の速度で読み取ることができることを意味するため、これは現実的です. 結果のどこが悪いのCriterion
ですか?