2010-10-26 4 views
1
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 

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 
    content <- readFile s 
    return (read content) 

main :: IO() 
main = do 
    t5 <- getCPUTime 
    content <- learquivo "mkList1.txt" 
    let !mapasort = rnf $ map sort content 
    t6 <- getCPUTime 
    let diffft6t5 = (fromIntegral (t6 - t5))/(10^12) 
    printf "Computation time Mapasort: %0.3f sec\n" (diffft6t5 :: Double) 

Как определить, оценивает ли он все элементы контента?как заставить оценить это выражение?

let !mapasort = rnf $ map sort content 

Я использовал линию в winghci:

*Main> let !mapasort = rnf $ map sort content 

Но, вернулся:

*Main> mapasort() 

Благодаря

+0

Примечание Я установил свой отправил код, чтобы он на самом деле работает. Убедитесь, что он отражает код, который вы запускали. –

+0

Существует пакет доступных для взлома для синхронизации ввода-вывода. Он называется System.TimeIt и работает так же, как функция времени, которую вы указали –

+0

Спасибо, Jonno_FTW, я заменил в своей программе. – Gmp

ответ

5

Я вижу два вопроса:

1) Почему является maport оценивается на единицу, ().

Потому что функция rnf всегда возвращает (). See the documentation.

2) Все ли оценивали

Да. Экземпляр DeepSeq (который где rnf живет) для списка просто вызывает deepseq экземпляра для каждого элемента в списке:

rnf [] =() 
rnf (x:xs) = rnf x `seq` rnf xs 

Ваши элементы всех Ints, которые имеют правильный экземпляр NFData.

И я хотел бы добавить еще два вопроса:

3) Как это должно быть сделано бенчмаркинг правильно?

Использование Criterion. Здесь есть много защитников Criterion, вы можете найти ответы, которые послужили бы хорошими примерами поиска.

4) Как следует оценивать эту оценку для целей, не связанных с бенчмаркингом?

Использование параллельного пакета.

import Control.Parallel.Strategies 
... 
let !mapsort = (map sort content) `using` (evalList rdeepseq) 

или еще с помощью rnf:

let mapsort = map sort content 
    !_ = rnf mapsort 
+0

Хорошо, TomMD, мне удалось установить Criterion, но я не мог использовать его, поэтому продолжал настаивать на этом, но мне очень коротко работать, поэтому я подумал, что что-то не так. Я попробую использовать Criterion и задаю здесь вопросы, потому что я посмотрел документацию, я пытался что-то сделать, но не работал. Спасибо. – Gmp

+0

попробуйте следующее: cabal install -f-Chart критерий таким образом вы можете избежать всех вещей gtk, которые иногда дают проблемы. – mayahustle

+0

Теперь Критерий работает, мне нужно научиться использовать. – Gmp

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