4

プログラムが 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ですか?

4

1 に答える 1