As of now, ATS does not perform any optimization wrt. currying.
So calling curried functions results in closures to be formed at run-time,
which can be very costly in terms of performance.

An optimizer for currying essentially turns your second version of 'count'
into the first version. I will try to structure ATS3 in a way to allow
interested
parties to provide such optimizers.

Cheers!


On Tue, Sep 4, 2018 at 10:15 PM Julian Fondren <[email protected]>
wrote:

> Consider the following:
>
> #include "share/atspre_staload.hats"
>
> typedef oobindex(n:int) = [m:int | m >= ~1; m < n] int(m)
> typedef coins(n:int) = arrayref(int, n)
>
> fun count{n:nat}(sum: int, i: oobindex(n), coins: coins(n)): int =
>         ifcase
>         | i < 0 => 0
>         | sum < 0 => 0
>         | sum = 0 => 1
>         | _ => smaller + same where {
>                 val smaller = count(sum, i-1, coins)
>                 val same = count(sum - coins[i], i, coins)
>         }
>
> val coins = (arrayref)$arrpsz{int}(1, 5, 10, 25, 50)
> implement main0() =
>         println!("(A) count(1000) = ", count(1000, 4, coins))
>
>
> and:
>
> #include "share/atspre_staload.hats"
>
> typedef oobindex(n:int) = [m:int | m >= ~1; m < n] int(m)
> typedef coins(n:int) = arrayref(int, n)
>
> fun count{n:nat}(sum: int)(i: oobindex(n))(coins: coins(n)): int =
>         ifcase
>         | i < 0 => 0
>         | sum < 0 => 0
>         | sum = 0 => 1
>         | _ => smaller + same where {
>                 val smaller = count(sum)(i-1)(coins)
>                 val same = count(sum - coins[i])(i)(coins)
>         }
>
> val coins = (arrayref)$arrpsz{int}(1, 5, 10, 25, 50)
> implement main0() =
>         println!("(A) count(1000) = ", count(1000)(4)(coins))
>
>
> Compiled and timed:
>
> $ patscc -DATS_MEMALLOC_GCBDW -O3 -o coin coin.dats -lgc
> $ patscc -DATS_MEMALLOC_GCBDW -O3 -o coin2 coin2.dats -lgc
>
> $ for v in '' 2; do for x in 1 2 3; do time ./coin$v; done; echo -----; done
> (A) count(1000) = 801451
>
> real    0m0.363s
> user    0m0.355s
> sys     0m0.009s
> (A) count(1000) = 801451
>
> real    0m0.307s
> user    0m0.303s
> sys     0m0.004s
> (A) count(1000) = 801451
>
> real    0m0.307s
> user    0m0.305s
> sys     0m0.002s
> -----
> (A) count(1000) = 801451
>
> real    0m33.251s
> user    0m36.228s
> sys     0m7.117s
> (A) count(1000) = 801451
>
> real    0m35.519s
> user    0m38.485s
> sys     0m6.951s
> (A) count(1000) = 801451
>
> real    0m36.157s
> user    0m39.029s
> sys     0m7.151s
> -----
>
> s -lgc
>
>
> "Introduction to Programming in ATS" already recommends against currying,
> but with the above in mind I'd recommend against it a bit more strongly :)
>
> --
> You received this message because you are subscribed to the Google Groups
> "ats-lang-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/ats-lang-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ats-lang-users/3e73ad42-12b4-4749-a409-dc54e47b732c%40googlegroups.com
> <https://groups.google.com/d/msgid/ats-lang-users/3e73ad42-12b4-4749-a409-dc54e47b732c%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"ats-lang-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/ats-lang-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ats-lang-users/CAPPSPLpcW0UhvPUTQUDVEwJM5vCb4435o73qHxDR0Ntn2%2B%2BsTQ%40mail.gmail.com.

Reply via email to