On 04/27/2014 09:16 PM, Matthew Flatt wrote:
At Sun, 27 Apr 2014 18:56:32 -0600, Neil Toronto wrote:
Strange thing, though: while `inexact->exact` is now about 10x faster,
my TR implementation `flonum->rational` is now about 7x slower. I've
verified that `flonum->fields` accounts for about 85% of the running
time. I see that you've changed `integer-bytes->integer`, which
`flonum->fields` uses. Could it have been a pessimization on certain
platforms?

That's surprising. I don't expect the modified `integer-bytes->integer`
to be any slower.

Are you timing with the "flonum-to-racket.rkt" that you sent me? When I
run it on various machines (Mac 32-bit x86, Mac 64-bit x86, Mac 32-bit
PPC, Linux 64-bit x86, Windows 64-bit x86 VM), the time reported for
your code is not slower than before, and it's consistently within 50%
of the time reported for the new `inexact->exact`.

I was being stupid. The file I sent you, which I did the majority of my testing with, does 100,000 conversions in the speed test. At some point, I changed it to 1,000,000. When I use 100,000 again, the TR implementation `flonum->rational` actually takes 50% less time than it used to. So thanks again, and sorry about making you test more!

For anyone wondering what this stuff means: most mixed exact/inexact math in Racket should be up to 5x or so faster now, depending on how conversion-heavy it is and how large the numbers are. On my machine, `real->double-flonum` is 1x or 25x faster on exact rationals (1x if the numerator and denominator both fit in a flonum; we optimized the slow path), and `inexact->exact` is 4x-100x faster (depending on the magnitude of the flonum's exponent). Also, conversions from exact to inexact now always find the closest approximation, so e.g. `sqrt` is a little more accurate when given exact rationals.

FWIW, the C implementations aren't much faster than the Typed Racket prototypes. I find that totally awesome.

Neil ⊥

_________________________
 Racket Developers list:
 http://lists.racket-lang.org/dev

Reply via email to