2017-04-21 2 views
4

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の結果に何が間違っていますか?

+1

*「3.617msで12.9MBがメモリにロードされているようですが、これは私のSSDが3 + MB/sを読み取ることができるので現実的ではありません。そう思える。 4msで12MBは3MB/sではなく3GB/sになります。 – Zeta

+0

@Zeta申し訳ありません、あなたが正しいです。それはタイプミスで、私はそれを修正しました。 3GB/sはまだ私のSSDには現実的ではありません。 –

+3

現代的なOSがファイルをメモリにキャッシュする必要があるとすれば、3GB/sは現実的です。これはもちろん、Criterionとの違いを説明するものではありません。 –

答えて

0

出力をhtmlファイルに書き込むことで、私のCriterionベンチマークの視覚的結果を調べました。最初の実行には0.020秒、残りのブロックには0.003秒かかることがわかりました。

キャッシュのためにこれらの結果が得られました。

関連する問題