내 프로그램이 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
결과에 어떤 문제가 있습니까?
* "3.617ms에서 12.9MB가 메모리에로드되는 것 같습니다. 내 SSD가 3MB/s를 읽을 수 있음을 나타내므로 사실적이지 않습니다." 좋아 보인다. 4ms에서 12MB는 3MB/s가 아닌 3GB/s입니다. – Zeta
@Zeta 죄송합니다, 당신 말이 맞습니다. 그것은 오타이고 나는 그것을 고쳤습니다. 3GB/s는 여전히 내 SSD에 현실적이지 않습니다. –
현대 OS가 파일을 메모리에 캐시해야하므로 3GB/s가 현실적입니다. 이것은 물론 Criterion과의 차이점을 실제로 설명하지는 않습니다. –