2010-10-21 2 views
2

Что здесь не так, это Lazy Evaluation?Benchmarking и ленивая оценка

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 является список из 100 списков 100 случайных чисел в каждом, более или менее, как это: [[23,45 , 89,78,89 ...], [4783, 44, 34 ...] ...]

Я сделал тест печати mapasort:

  • время $ печати («Сортировка usando карта =», mapasort)

И время вычислений значительно возросла, так что я думаю, что что-то не так.

Computation time: 1.188 sec

Благодаря

+0

У вас возникли проблемы с установкой Критерий. Если вы идете на freenode (IRC) и присоединяетесь к людям канала #haskell, вы можете помочь вам установить его. –

+0

TomMD, я сделаю это, спасибо – Gmp

ответ

6

Да, это из-за лени в Haskell. Вы пытаетесь обойти лень, используя seq, но так как seq «неглубокий» (т.е. он не пересекает всю структуру выражения - только «внешний» слой), это заставит оценку map , но не оценка sort с.

Чтобы исправить это, используйте deepseq вместо seq или, еще лучше, используйте библиотеку для бенчмаркинга вместо getCPUTime.

+0

sepp2k, есть ли библиотека бенчмаркинга, которая вычисляет время, равное getCPUTime? Критерий попытался установить, но не мог ли она это сделать? – Gmp

Смежные вопросы