[racket] Untyped arithmetics performance
Jens Axel and Alexander have provided the answer, but in case it helps
to see what they mean, try these loops that display the intermediate
results:
(for/fold ([v 0]) ([x (in-range 100)])
(displayln v)
(+ v (/ x 100)))
(for/fold ([v 0]) ([x (in-range 100)])
(displayln v)
(+ v (/ x (- 100 x))))
At Sat, 24 Jan 2015 17:39:39 +0100, Daniel Kvasnička wrote:
> Hi, I'm observing the following difference in performance:
>
> > (time (exact->inexact (for/sum ([x (in-range 10000)]) (/ x 10000))))
> cpu time: 6 real time: 6 gc time: 0
> 4999.5
> > (time (exact->inexact (for/sum ([x (in-range 10000)]) (/ x (- 10000 x)))))
> cpu time: 3624 real time: 3622 gc time: 39
> 87876.06036044382
>
> The difference seems huge to me and I'm wondering whether it's "normal" and
> what are the right tools to overcome it.
> If I understand it correctly, it's about contract checking and the fact that
> there is one more math opeartion involved does not in itself lead to such
> difference. The division operator needs to be sure that the outcome of the
> minus op. is of the right type, is that correct?
>
> If so -- and the increase in time cannot be considered a "bug" -- what is the
> right way to get around that. I've employed 2 ways: Typed Racket and switching
> the portion of code to racket/flonum. Both of these approaches resulted in big
> perf. improvement and basically make the computation instant again. Are these
> the right, "rackety", solutions? I've also tried to use unchecked ops but
> Racket 6.1.1 is constantly segfaulting on me when running this (from my
> digging I think unsafe-fl/ is what segfaults it):
>
> (time (exact->inexact (for/sum ([x (in-range 10000)]) (unsafe-fl/ (->fl x)
> (unsafe-fx- 10000 x)))))
>
> Daniel
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users