
@florence has joined the channel

@samth Looking at your sort
change, I’m not sold on the idea of copying the code into a new module. I had in mind arranging for “racket/private/sort.rkt” to provide a generic function.

Do you have a sense of whether the specialized sort
functions are worthwhile?

I think changing the implementation of sort
to provide something generic would not be easy

because of both the specialization and the vector sorting

but I don’t know if specialization is worthwhile

yes, the specialization is worthwhile, I think

at least, this is a 2x performance difference:

#lang racket
(define l (build-list 1000000 (λ _ (random))))
(time (length (sort l <)))
(time (length (sort l (λ (x y) (< x y)))))

still significant if the function is (define lt <)

I don’t understand why (define lt <)
matters, since it’s a dynamic test to pick a specialization

oh, hm

that was just a gc effect

sorry

Ok. I don’t think <
versus (lambda (x y) (< x y))
is the right test, but I’ll investigate more in a while

lifting the function to the toplevel doesn’t really change the performance from the lambda
version

That’s reassuring, but an indirect call to <
will be different than an indirect call to (lambda (x y) (< x y))

removing the specialization entirely produces slower results for <
than for (lambda ...)

so specialization is a non-trivial improvement — about a 60% slowdown when removed

for that benchmark, at least

@samth Ok, thanks for checking. Going back to the question of a generic sort, it looks like racket/private/base
defines generic-sort
, so maybe that could just be exported?

@mflatt I don’t see that in my copy of racket/private/base

or do you mean racket/private/sort
?

Yes - should have been racket/private/sort

pulling that out would require restructuring racket/private/sort
not to use a single define-values

which I think is there because it improved performance

? I mean just add generic-sort
to the provide
and then call generic-sort
instead of sort
in the expander

generic-sort
is defined inside the (let () ...)
that’s the RHS of the (define-values (sort vector-sort vector-sort!) ...)

I can try restructuring things, though

Ok, I keep forgetting that this module is old-school…. so add generic-sort
to the define-values
, add it to the final values
, etc.

that won’t work — the simplifier can’t remove the rest of the define-values

and then we’re in the same place we are now

Ok, I see what you mean

I expect that the performance difference of having it all in one lexical scope is small, and will change before this code is actually shipped

I guess the let
makes the macro implementation goes away when it’s expanded

Still, I think restructuring must be a better solution than copying the implementation

Ok if I merge the other parts of the PR?

yes

also, annoyingly, generic-sort
operates on vectors of powers-of–2 size

so I won’t get this done tonight

@samth Beware that your commit exposed a bug in any-side-effects?
, where the generic if
case looked at thn
and thn
instead of thn
and els

yes

I fixed that bug locally

I also pushed what I think is a bug-fix to make-match

but I don’t understand the code well enough to be sure

ok; I’ll include the repairs