2017-04-21 93 views
4

我想知道需要多長時間我的程序需要將12.9MB的.wav文件讀入內存。讀取文件到內存的功能如下所示:標準IO操作與標準

import qualified Data.ByteString  as BS 

getSamplesFromFileAsBS :: FilePath -> IO (BS.ByteString) 

它需要的文件的名稱,並返回的樣品作爲ByteString。它還對數據執行其他一些有效性檢查並忽略標題信息。我使用ByteString.hGet將樣本的ByteString讀入內存。

如果我現在基準此功能和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) 

它似乎12.9MB加載到內存3.617ms 。這看起來並不現實,因爲它表明我的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.617毫秒內將12.9MB加載到內存中,這看起來並不現實,因爲它表明我的SSD可以讀取3 + MB/s,而不是這種情況。」*似乎是對的。 4ms中的12MB將是3GB/s,而不是3MB/s。 – Zeta

+0

@澤塔我很抱歉,你是對的。這是一個錯字,我糾正了它。對於我的SSD,3GB/s仍然不太實際。 –

+3

我認爲3GB/s是現實的,因爲現代操作系統應該將文件緩存在內存中。這當然不能解釋你與Criterion的區別。 –

回答

0

通過將輸出寫入html文件,我查看了我的Criterion基準測試的可視化結果。我可以清楚地看到第一次運行大約需要0.020s,而其餘的(高速緩存之後)大約需要0.003s。

所以我得到這些結果,因爲緩存。