2017-04-21 9 views
4

내 프로그램이 12.9MB .wav 파일을 메모리로 읽는 데 걸리는 시간을 알고 싶습니다. 다음과 같이 메모리에 파일을 읽고 기능은 같습니다기준을 사용한 IO 작업 벤치마킹

import qualified Data.ByteString  as BS 

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

그것은 파일의 이름을 사용하고 ByteString로 샘플을 반환합니다. 또한 데이터에 대한 다른 유효성 검사를 수행하고 헤더 정보를 무시합니다. ByteString.hGet을 사용하여 메모리에 샘플 ByteString을 읽었습니다.

만약 내가 지금 벤치 마크 Criterion를 사용하여 12.9MB 파일이 기능 :

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를로드하는 것 : 나는 다음과 같은 결과를 얻을 수

bencher :: FilePath -> IO() 
bencher fp = defaultMain [ 
    bench "Reading all the samples from a file." $ nfIO (getSamplesFromFileAsBS fp) 
    ] 

. 이것은 내 SSD가 3GB/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가 3MB/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 초가 걸렸음을 분명히 알 수있었습니다.

캐싱 때문에 이러한 결과가 나타납니다.