
Здравствуйте, 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 ()