2017-04-21 2 views
4

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?

+1

* "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

+0

@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. –

+3

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. –

Répondre

0

J'ai regardé les résultats visuels de mon test de performance Criterion en écrivant la sortie dans un fichier html. Je pouvais clairement voir que le premier tour prenait environ 0.020s, alors que le reste (après mise en cache) prend environ 0.003s. Donc, je reçois ces résultats à cause de la mise en cache.