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
結果有什麼問題?
*「它似乎在3.617毫秒內將12.9MB加載到內存中,這看起來並不現實,因爲它表明我的SSD可以讀取3 + MB/s,而不是這種情況。」*似乎是對的。 4ms中的12MB將是3GB/s,而不是3MB/s。 – Zeta
@澤塔我很抱歉,你是對的。這是一個錯字,我糾正了它。對於我的SSD,3GB/s仍然不太實際。 –
我認爲3GB/s是現實的,因爲現代操作系統應該將文件緩存在內存中。這當然不能解釋你與Criterion的區別。 –