[racket] Untyped arithmetics performance

From: Daniel Kvasnička (daniel.kvasnicka at me.com)
Date: Sat Jan 24 12:14:39 EST 2015

Thanks guys, feeling embarrased now :) A little more basic math reasoning could have helped me ;) Makes sense.
What about the segmentation fault? Am I doing something wrong?

Daniel

> On 24. 1. 2015, at 17:56, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> 
> 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



Posted on the users mailing list.