2010-10-21 9 views
2

Qu'est-ce qui ne va pas ici, est-ce que l'évaluation paresseuse aussi?L'analyse comparative et l'évaluation paresseuse

teste.hs

module Main where 

import Control.Parallel(par,pseq) 
import Text.Printf 
import Control.Exception 
import System.CPUTime 
import Data.List 
import IO 
import Data.Char 
import Control.DeepSeq 

--Calcula o tempo entre o inicio e o fim de rodagem do programa 
time :: IO t -> IO t 
time a = do 
    start <- getCPUTime 
    v <- a 
    end <- getCPUTime 
    let diff = (fromIntegral (end - start))/(10^12) 
    printf "Computation time: %0.3f sec\n" (diff :: Double) 
    return v 

learquivo :: FilePath -> IO ([[Int]]) 
learquivo s = do 
      conteudo <- readFile s 
      return (read conteudo) 

main :: IO() 
main = do 
    conteudo <- learquivo "mkList1.txt" 
    mapasort <- return (map sort conteudo) 
    time $ mapasort `seq` return() 

*Main> main
Computation time: 0.125 sec

mkList1.txt est une liste de 100 listes de 100 nombres aléatoires dans chaque, plus ou moins comme ceci: [[23,45 , 89,78,89 ...], [4783, 44, 34 ...] ...]

Je l'ai fait un test d'impression mapasort:

  • temps print $ ("Tri carte usando =", mapasort)

Et le temps de calcul, je pense considérablement augmenté si quelque chose ne va pas.

Computation time: 1.188 sec

Merci

+0

Vous avez mentionné avoir des problèmes pour installer Criterion. Si vous allez sur freenode (IRC) et que vous rejoignez les gens du canal #haskell, vous pouvez l'installer. –

+0

TomMD, je vais le faire, merci – Gmp

Répondre

6

Oui, cela est dû à la paresse de Haskell. Vous essayez de contourner la paresse en utilisant seq, mais puisque seq est "peu profonde" (c'est-à-dire qu'elle ne traverse pas toute la structure de l'expression - seulement la couche "externe"), elle va forcer l'évaluation de la , mais pas l'évaluation des sort s.

Pour résoudre ce problème, utilisez deepseq au lieu de seq ou, encore mieux, utilisez une bibliothèque pour l'analyse comparative au lieu d'utiliser getCPUTime.

+0

sepp2k, y a-t-il une bibliothèque de benchmarking, qui calcule le temps égal à getCPUTime? Criteriom a essayé d'installer mais ne pouvait-elle pas le faire? – Gmp