Текущее состояние длин
Mar. 7th, 2016 05:09 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Померил тут, похоже про магические хэши не надо рассказывать. Тут length' - текущая реализация из GHC, length0 - трех?летней давности:
{-# LANGUAGE MagicHash #-} module Length where import GHC.Prim import GHC.Exts (Int(I#)) import Data.List length0 :: [a] -> Int length0 l = len l 0# where len :: [a] -> Int# -> Int len [] a# = I# a# len (_:xs) a# = len xs (a# +# 1#) length' :: [a] -> Int length' xs = lenAcc xs 0 where lenAcc [] n = n lenAcc (_:ys) n = lenAcc ys (n+1) length'' :: [a] -> Int length'' = foldl' (const . succ) 0 length''' :: [a] -> Int length''' [] = 0 length''' (_:xs) = 1 + length''' xsРезультаты
C:\Users\deniok\Documents\Haskell>ghc -O2 Length.hs [1 of 1] Compiling Length ( Length.hs, Length.o ) C:\Users\deniok\Documents\Haskell>ghci Length.hs GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help Ok, modules loaded: Length. > :set +s > length [1..100000000] 100000000 (1.56 secs, 8,014,793,624 bytes) > length0 [1..100000000] 100000000 (1.55 secs, 8,002,029,776 bytes) > length' [1..100000000] 100000000 (1.55 secs, 8,001,085,992 bytes) > length'' [1..100000000] 100000000 (2.00 secs, 9,601,216,960 bytes) > length''' [1..100000000] *** Exception: stack overflow > > length [1..50000000] 50000000 (0.86 secs, 3,938,034,240 bytes) > length0 [1..50000000] 50000000 (0.84 secs, 3,937,631,120 bytes) > length' [1..50000000] 50000000 (0.84 secs, 4,240,225,000 bytes) > length'' [1..50000000] 50000000 (1.08 secs, 4,845,463,912 bytes) > length''' [1..50000000] 50000000 (1.34 secs, 4,420,898,928 bytes)
no subject
Date: 2016-03-07 02:26 pm (UTC)no subject
Date: 2016-03-07 03:15 pm (UTC)no subject
Date: 2016-03-07 03:25 pm (UTC)И, как побочный эффект, литералы хавали меньше памяти?
no subject
Date: 2016-03-07 04:17 pm (UTC)https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/primitives.html
Считаются быстро, свойства плохие.
no subject
Date: 2016-03-07 07:44 pm (UTC)Там не может получиться, что компилятор построит мега-санки
I# (...(((0# +# 1#) +# 1#) + 1#)...)
, которые влезли в память (в отличие от length''' только потому, что боксированные данные занимают вдвое больше места)?Как насчёт заведомо энергичного
length00 = I# . foldl' (const . inc) 0# where inc h = h +# 1#
no subject
Date: 2016-03-07 08:17 pm (UTC)no subject
Date: 2016-03-07 09:39 pm (UTC)no subject
Date: 2016-03-07 09:46 pm (UTC)no subject
Date: 2016-03-07 10:47 pm (UTC)no subject
Date: 2016-03-08 08:23 am (UTC)И бают, будто бы в ответе сказано, что corge не может привести к расходимости. Так оно вполне может, если только там тип явно не указан. Я, конечно, не вполне понимаю, что значит "корректный набор аргументов", но уж corge стопудово может быть чем угодно.
no subject
Date: 2016-03-08 08:24 am (UTC)no subject
Date: 2016-03-08 10:34 am (UTC)no subject
Date: 2016-03-08 10:50 am (UTC)no subject
Date: 2016-03-08 11:15 am (UTC)no subject
Date: 2016-03-08 10:39 am (UTC)no subject
Date: 2016-03-09 11:03 am (UTC)?
no subject
Date: 2016-03-09 11:25 am (UTC)no subject
Date: 2016-03-09 11:37 am (UTC)no subject
Date: 2016-03-09 11:28 pm (UTC)no subject
Date: 2016-03-10 07:20 am (UTC)