Re[13]: ФП: вводная статья
От: Quintanar Россия  
Дата: 29.09.04 15:48
Оценка:
Здравствуйте, Gaperton, Вы писали:

WH>>Но оказывается узкое место ПАМЯТЬ...

G>Так я и предполагал, но говорить не стал — вдруг ошибусь? Ее все-таки в восемь раз активнее читать приходится, это не могло не повлиять на производительность. Но того, что это единственный значимый фактор, я, конечно, не ожидал. Прикольно.

G>Неплохой компилятор у Clean. Но зело глючный — писать на нем серьезные программы страшновато. У меня он на довольно простых вещах крешится.


На Haskell'e массивы помедленнее работают Моя программа выполнилась за 66 секунд, программа на С++ за 24. Причем пришлось попинать ghc, чтобы он улучшил скорость программы. Одна оптимизация с INLINE сократила время выполнения на 24 секунды. Так что ghc оптимизировать еще и оптимизировать. Вариант с битовыми массивами работал еще медленнее, хотя я его не оптимизировал.

import Data.Word
import Data.Array.MArray
import Data.Array.IO

type Atype = IOUArray Word32 Word8

newIOArray::(Word32, Word32) -> Word8 -> IO Atype
newIOArray = newArray

size::Word32
size = 100000000

{-# INLINE delete_elems #-}

delete_elems::Atype->Word32->Word32->IO Atype
delete_elems array i fi
    | i >= size = return array
    | otherwise =
        do
          writeArray array i 1
          delete_elems array (i+fi) fi

{-# INLINE sieve #-}

sieve::Atype->Word32->IO Atype
sieve array i
    | i == size = return array
    | otherwise =
        do
          elem <- readArray array i
          array <- if (elem == 0) then delete_elems array (i*2) i else return array
          sieve array (i+1)

main = 
    do
      array <- newIOArray (1,size) 0
      array <- sieve array 2
      return ()
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.