On 12/11/2013 11:07 AM, ro...@racket-lang.org wrote:
robby has updated `master' from 542e256206 to c321f6dd0c.
   http://git.racket-lang.org/plt/542e256206..c321f6dd0c

=====[ One Commit ]=====================================================
Directory summary:
   37.6% pkgs/racket-pkgs/racket-test/tests/racket/contract/
    5.5% pkgs/
   46.3% racket/collects/racket/contract/private/
   10.0% racket/collects/racket/private/

~~~~~~~~~~

c321f6d Robby Findler <ro...@racket-lang.org> 2013-12-04 22:35
:
| Change contract system so that projections are more first-order friendly

Awesome. I've attached some more benchmarks, for `flrational?', `flsinh', `fllog1p', `lg+', and `flgamma'. These functions are pretty representative, and have a range of complexity from trivial to complicated. (For example, `flrational?' is implemented using two flops, and `flgamma' usually does ~50 flops in the range I tested.)

Approximate average times in milliseconds for 1 million calls:

Function         TR     Untyped pre-push     Untyped post-push
--------------------------------------------------------------
flrational?       5             322                   98
flsinh           55             343                  121
fllog1p          47             351                  117
lg+              61             384                  154
flgamma         165             521                  262

There's also less variance in the timings, probably because there are fewer minor GC pauses during the tests.

Not shown on the table: untyped `sinh' calls take 140ms in the same test, so it's now faster to use `flsinh' from `math/flonum' in untyped code, if operating on flonums. Cool. We might be getting close to where numeric primitives implemented in Typed Racket are faster than the same primitives implemented in C.

The `flrational?' test is still amazing in TR. The function's two flops get inlined (I checked the decompiled module), which I suppose allows more JIT-level optimizations.

The only things I can think of to account for the extra time over TR's now are range/domain checking and boxing flonum return values. I think I remember hearing something from someone (maybe Eric?) at RacketCon about inlining contract checks. Is that in the works?

Neil ⊥

#lang racket

(require math/flonum
         math/special-functions
         racket/unsafe/ops
         (only-in typed/racket/base :))

(define x (random))

(: bx Boolean)
(define bx #f)

(define vec (make-flvector 1))

(define n 1000000)

(printf "flrational?~n")
(for ([_  (in-range 5)])
  (time (for ([_  (in-range n)])
          (set! bx (flrational? x)))))
(newline)

(printf "flsinh~n")
(for ([_  (in-range 5)])
  (time (for ([_  (in-range n)])
          (unsafe-flvector-set! vec 0 (flsinh x)))))
(newline)

(printf "fllog1p~n")
(for ([_  (in-range 5)])
  (time (for ([_  (in-range n)])
          (unsafe-flvector-set! vec 0 (fllog1p x)))))
(newline)

(printf "lg+~n")
(for ([_  (in-range 5)])
  (time (for ([_  (in-range n)])
          (unsafe-flvector-set! vec 0 (lg+ x x)))))
(newline)

(printf "flgamma~n")
(for ([_  (in-range 5)])
  (time (for ([_  (in-range n)])
          (unsafe-flvector-set! vec 0 (flgamma x)))))
(newline)

flrational?
cpu time: 4 real time: 5 gc time: 0
cpu time: 4 real time: 6 gc time: 0
cpu time: 8 real time: 5 gc time: 0
cpu time: 4 real time: 6 gc time: 0
cpu time: 8 real time: 5 gc time: 0

flsinh
cpu time: 52 real time: 55 gc time: 4
cpu time: 56 real time: 54 gc time: 0
cpu time: 52 real time: 54 gc time: 0
cpu time: 56 real time: 54 gc time: 4
cpu time: 56 real time: 56 gc time: 0

fllog1p
cpu time: 48 real time: 46 gc time: 0
cpu time: 44 real time: 48 gc time: 0
cpu time: 48 real time: 47 gc time: 4
cpu time: 48 real time: 47 gc time: 0
cpu time: 48 real time: 47 gc time: 0

lg+
cpu time: 60 real time: 61 gc time: 0
cpu time: 60 real time: 61 gc time: 0
cpu time: 60 real time: 61 gc time: 4
cpu time: 64 real time: 61 gc time: 0
cpu time: 60 real time: 63 gc time: 0

flgamma
cpu time: 168 real time: 167 gc time: 4
cpu time: 164 real time: 165 gc time: 0
cpu time: 164 real time: 164 gc time: 0
cpu time: 164 real time: 164 gc time: 4
cpu time: 168 real time: 165 gc time: 0

flrational?
cpu time: 316 real time: 315 gc time: 0
cpu time: 316 real time: 314 gc time: 0
cpu time: 328 real time: 328 gc time: 4
cpu time: 324 real time: 326 gc time: 0
cpu time: 328 real time: 327 gc time: 0

flsinh
cpu time: 348 real time: 350 gc time: 12
cpu time: 336 real time: 336 gc time: 0
cpu time: 340 real time: 338 gc time: 0
cpu time: 348 real time: 349 gc time: 16
cpu time: 344 real time: 343 gc time: 4

fllog1p
cpu time: 348 real time: 347 gc time: 4
cpu time: 352 real time: 354 gc time: 4
cpu time: 348 real time: 349 gc time: 8
cpu time: 348 real time: 347 gc time: 4
cpu time: 360 real time: 359 gc time: 4

lg+
cpu time: 376 real time: 379 gc time: 0
cpu time: 384 real time: 384 gc time: 8
cpu time: 388 real time: 387 gc time: 4
cpu time: 380 real time: 381 gc time: 0
cpu time: 388 real time: 387 gc time: 4

flgamma
cpu time: 516 real time: 517 gc time: 8
cpu time: 532 real time: 530 gc time: 12
cpu time: 516 real time: 518 gc time: 8
cpu time: 528 real time: 529 gc time: 4
cpu time: 516 real time: 515 gc time: 16

flrational?
cpu time: 100 real time: 99 gc time: 4
cpu time: 96 real time: 98 gc time: 0
cpu time: 100 real time: 100 gc time: 0
cpu time: 96 real time: 96 gc time: 0
cpu time: 100 real time: 98 gc time: 0

flsinh
cpu time: 124 real time: 125 gc time: 0
cpu time: 120 real time: 120 gc time: 0
cpu time: 120 real time: 120 gc time: 0
cpu time: 120 real time: 120 gc time: 0
cpu time: 120 real time: 122 gc time: 0

fllog1p
cpu time: 116 real time: 116 gc time: 0
cpu time: 120 real time: 118 gc time: 0
cpu time: 116 real time: 118 gc time: 0
cpu time: 120 real time: 120 gc time: 0
cpu time: 116 real time: 115 gc time: 8

lg+
cpu time: 152 real time: 153 gc time: 4
cpu time: 152 real time: 152 gc time: 0
cpu time: 156 real time: 154 gc time: 4
cpu time: 156 real time: 155 gc time: 4
cpu time: 152 real time: 154 gc time: 4

flgamma
cpu time: 268 real time: 266 gc time: 8
cpu time: 260 real time: 261 gc time: 0
cpu time: 260 real time: 261 gc time: 0
cpu time: 264 real time: 262 gc time: 0
cpu time: 260 real time: 259 gc time: 0

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

Reply via email to