At Fri, 28 Feb 2014 10:50:11 -0500,
Stephen Bloch wrote:
> 
> On Feb 28, 2014, at 10:34 AM, Vincent St-Amour <stamo...@ccs.neu.edu> wrote:
> 
> > This code is probably the problem:
> > 
> >    (require/typed racket/unsafe/ops
> >                   [(unsafe-fx+ index+) [Index Index -> Index]]
> >                   [unsafe-fx+    [Fixnum Fixnum -> Fixnum]]
> >                   [unsafe-fx- (Fixnum Fixnum -> Fixnum)]
> >                   [unsafe-fl+ (Flonum Flonum -> Flonum)]
> >                   [unsafe-fl- (Flonum Flonum -> Flonum)]
> >                   [unsafe-fl* (Flonum Flonum -> Flonum)]
> >                   )
> > 
> > TR already provides types for these functions, so you can use:
> > 
> >    (require racket/unsafe/ops)
> > 
> > `require/typed' adds contracts to its imports (for safe typed-untyped
> > interop), which add a significant cost (85% of the running time,
> > according to the contract profiler).
> 
> Yike!  Thanks; I never would have thought of that.
> 
> There’s probably something in the documentation about “require/typed”
> as a source of inefficiency, but for whatever reason I didn’t stumble
> upon it.

The "typed-untyped interaction" section of the TR guide does mention the
overhead of contracts. I'll add mentions elsewhere in the docs (probably
in the caveats and optimization sections).

> > Removing the `require/typed' (except for `index+') brings the running
> > time (of the portion you were profiling) down from 22s to 15s. Replacing
> > the `index+'s with generic `+' and `assert's (to enforce `Index'
> > results) brings the running time down to 2.5s.
> 
> Generic ‘+’, not ‘unsafe-fx+’?

In this case, Typed Racket optimized it automatically based on the type
information, as confirmed by optimization coach.

> Should I be using racket/unsafe/ops at all?

I would recommend first seeing whether TR already optimizes operations
for you. If it doesn't, you can try adjusting the types. If that doesn't
work, then unsafe operations are a good option. I tend to use them as a
last resort.

Unsafe fixnum operations, specifically, are not usually a significant
improvement over generic arithmetic, because the fixnum case is already
on the fast path of generic operations, and fixnums are not boxed
(unlike flonums).

Vincent
____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to