12.9MB .wav
ファイルをメモリに読み込むのにどれくらいの時間がかかるか知りたい。次のようにファイルをメモリに読み込む機能はなります基準による入出力動作のベンチマーキング
import qualified Data.ByteString as BS
getSamplesFromFileAsBS :: FilePath -> IO (BS.ByteString)
これは、ファイルの名前を取り、ByteString
としてサンプルを返します。また、データの他の妥当性検査を実行し、ヘッダー情報を無視します。 ByteString.hGet
を使って、サンプルのByteString
をメモリに読み込みました。
もし私は今のベンチマークCriterion
を使用して12.9メガバイトのファイルを使用してこの機能を、:
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.9メガバイトを読み込むようだ:私は次のような結果を得る
bencher :: FilePath -> IO()
bencher fp = defaultMain [
bench "Reading all the samples from a file." $ nfIO (getSamplesFromFileAsBS fp)
]
。これは、私の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/sの速度で読むことができるという意味で現実的です。 Criterion
の結果に何が間違っていますか?
*「3.617msで12.9MBがメモリにロードされているようですが、これは私のSSDが3 + MB/sを読み取ることができるので現実的ではありません。そう思える。 4msで12MBは3MB/sではなく3GB/sになります。 – Zeta
@Zeta申し訳ありません、あなたが正しいです。それはタイプミスで、私はそれを修正しました。 3GB/sはまだ私のSSDには現実的ではありません。 –
現代的なOSがファイルをメモリにキャッシュする必要があるとすれば、3GB/sは現実的です。これはもちろん、Criterionとの違いを説明するものではありません。 –