Je veux savoir combien de temps il faut à mon programme pour lire un fichier de 12,9 Mo .wav
en mémoire. La fonction qui lit un fichier dans la mémoire se présente comme suit:Analyse comparative de l'action d'E/S avec le critère
import qualified Data.ByteString as BS
getSamplesFromFileAsBS :: FilePath -> IO (BS.ByteString)
Il prend le nom du fichier et retourne les échantillons comme ByteString
. Il effectue également d'autres contrôles de validité sur les données et ignore les informations d'en-tête. J'ai lu le ByteString
des échantillons dans la mémoire en utilisant ByteString.hGet
.
Si je maintenant référence cette fonction avec un fichier 12.9MB, en utilisant Criterion
:
bencher :: FilePath -> IO()
bencher fp = defaultMain [
bench "Reading all the samples from a file." $ nfIO (getSamplesFromFileAsBS fp)
]
Je reçois le résultat suivant:
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)
Il semble charger 12.9MB en mémoire dans 3.617ms . Cela ne semble pas réaliste car cela indique que mon SSD peut lire 3 + Go/s, ce qui n'est pas du tout le cas. Qu'est-ce que je fais mal?
j'ai décidé d'essayer une autre façon (plus naïve), en mesurant manuellement la différence de temps:
runBenchmarks :: FilePath -> IO()
runBenchmarks fp = do
start <- getCurrentTime
samplesBS <- getSamplesFromFileAsBS fp
end <- samplesBS `deepseq` getCurrentTime
print (diffUTCTime end start)
Cela me donne le résultat suivant: 0.023105s. C'est réaliste car cela signifierait que mon SSD peut lire à une vitesse d'environ 600 Mo/s. Quel est le problème avec le résultat Criterion
?
* "Il semble charger 12,9 Mo en mémoire en 3,617 ms Cela ne semble pas réaliste car cela indique que mon SSD peut lire 3 + Mo/s, ce qui n'est pas du tout le cas." Semble correct. 12 Mo en 4 ms serait 3 Go/s, pas 3 Mo/s. – Zeta
@Zeta Je suis désolé, vous avez raison. C'est une faute de frappe et je l'ai corrigé. 3 Go/s n'est toujours pas réaliste pour mon SSD. –
Je dirais que 3 Go/s est réaliste étant donné qu'un système d'exploitation moderne devrait mettre le fichier en mémoire cache pour vous. Bien sûr, cela n'explique pas vraiment la différence que vous obtenez avec Criterion. –