[Agda] Nat arithmetic performance
Ulf Norell
ulf.norell at gmail.com
Sat Sep 24 16:40:43 CEST 2016
Oh, and the reason your Haskell program doesn't have the same problem is
that you made a mistake in the implementation sum': the recursive call is
to the library sum instead of sum'.
/ Ulf
On Sat, Sep 24, 2016 at 4:36 PM, Ulf Norell <ulf.norell at gmail.com> wrote:
> On Sat, Sep 24, 2016 at 12:52 PM, Sergei Meshveliani <mechvel at botik.ru>
> wrote:
>
>> People,
>>
>> Please, find attached a certain test for performance of arithmetic in
>> Agda, as compared to ghc-7.10.2.
>>
>> Shortly saying, it is
>> sum [x*x - y*y | x, y <- [n .. 0]],
>> n = 1000, ..., 6000, ...
>>
>> The Hasell program is also there.
>>
>> {-
>> --------------------------------------------------------------------
>> Timing for Agda of September 16, 2016, ghc-7.10.2, 3 GHz computer
>>
>> n | s (control) | time [sec]
>> | | Agda ghc-7.10.2 -O
>> --------------------------------------------------
>> 1000 | 166499833500 | 0.3 | 0.04
>> 2000 | 2665332667000 | 1.3 | 0.2
>> 3000 | 13495498500500 | 3.0 | 0.4
>> 4000 | 42655997334000 | 5.1 | 0.8
>> 5000 | 104145829167500 | 8.0 | 1.6
>> 6000 | 215963994001000 | 11.9 | 2.5
>> -}
>>
>> The cost order of n^2 is as needed.
>> Bug GHC is somewhat 5 times faster.
>> I think, this factor of 5 is not so important.
>> But still, what may be its source?
>>
>
> You get a clue that something is wrong if you run with +RTS -s:
>
> $ ./NatArithPerformance +RTS -s
> n = 5000
> s = 104145829167500
> 8,616,354,344 bytes allocated in the heap
> 6,531,203,072 bytes copied during GC
> 1,593,171,592 bytes maximum residency (13 sample(s))
> 4,362,336 bytes maximum slop
> 2772 MB total memory in use (0 MB lost due to fragmentation)
>
> Tot time (elapsed) Avg pause Max
> pause
> Gen 0 15734 colls, 0 par 3.300s 3.427s 0.0002s
> 0.0016s
> Gen 1 13 colls, 0 par 2.329s 3.367s 0.2590s
> 1.5709s
>
> INIT time 0.000s ( 0.003s elapsed)
> MUT time 3.664s ( 3.460s elapsed)
> GC time 5.629s ( 6.794s elapsed)
> EXIT time 0.029s ( 0.275s elapsed)
> Total time 9.324s ( 10.531s elapsed)
>
> %GC time 60.4% (64.5% elapsed)
>
> Alloc rate 2,351,612,899 bytes per MUT second
>
> Productivity 39.6% of total user, 35.1% of total elapsed
>
> The key number here is total memory in use: 2772MB. You'll find that the
> Haskell program
> runs in constant space. In this case your problem is sum:
>
> sum : List ℕ → ℕ
> sum [] = 0
> sum (n ∷ ns) = n + (sum ns)
>
> For long lists this will build up a huge thunk of +s in memory before it
> can start evaluating. If you change it to
>
> open import Agda.Builtin.Strict
>
> foldl' : ∀ {a b} {A : Set a} {B : Set b} → (B → A → B) → B → List A → B
> foldl' f z [] = z
> foldl' f z (x ∷ xs) = primForce (f z x) λ z' → foldl' f z' xs
>
> sum : List ℕ → ℕ
> sum = foldl' _+_ 0
>
> we get instead
>
> n = 5000
> s = 104145829167500
> 8,201,151,016 bytes allocated in the heap
> 3,231,768 bytes copied during GC
> 195,104 bytes maximum residency (2 sample(s))
> 48,648 bytes maximum slop
> 2 MB total memory in use (0 MB lost due to fragmentation)
>
> Tot time (elapsed) Avg pause Max
> pause
> Gen 0 15848 colls, 0 par 0.039s 0.049s 0.0000s
> 0.0009s
> Gen 1 2 colls, 0 par 0.001s 0.010s 0.0049s
> 0.0096s
>
> INIT time 0.000s ( 0.002s elapsed)
> MUT time 3.335s ( 3.393s elapsed)
> GC time 0.039s ( 0.059s elapsed)
> EXIT time 0.000s ( 0.000s elapsed)
> Total time 3.376s ( 3.454s elapsed)
>
> %GC time 1.2% (1.7% elapsed)
>
> Alloc rate 2,459,180,636 bytes per MUT second
>
> Productivity 98.8% of total user, 96.6% of total elapsed
>
> On my machine that's within 25% of the corresponding Haskell program
> (which runs in 2.7s).
>
> / Ulf
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.chalmers.se/pipermail/agda/attachments/20160924/4ac4ff9d/attachment-0001.html
More information about the Agda
mailing list