我想知道我的程序将12.9MB .wav
文件读入内存需要多长时间。将文件读入内存的功能如下所示:
import qualified Data.ByteString as BS
getSamplesFromFileAsBS :: FilePath -> IO (BS.ByteString)
它获取文件的名称并将样本作为ByteString
返回。它还对数据执行一些其他有效性检查,并忽略标头信息。我使用ByteString
将ByteString.hGet
个样本读入内存。
如果我现在使用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 / s的速度读取。 Criterion
结果出了什么问题?
答案 0 :(得分:0)
我通过将输出写入jquery.js
文件来查看Criterion
基准测试的可视结果。我可以清楚地看到第一次运行大约需要0.020秒,而其余的(在缓存之后)需要大约0.003秒。
因为缓存,我得到了这些结果。