When I run my original program on my own machine (instead of Pasterack), the difference is more like 2-3x. So my original email overstated the speed difference a bunch. I don't know what's going on that makes it so different on pasterack.
An interesting side note -- we tried this program in Pycket, and two interesting things happened: - it turned out to be another test case for a problem we are working on right now -- memq was too slow because it was used previously with different types - when that's fixed, memq and member are the same speed, because Pycket's version of `eq?` is slower than it would be otherwise, precisely because it has to maintain the semantics that Robby doesn't like :) Sam On Sat, Sep 19, 2015 at 5:38 PM, Gustavo Massaccesi <[email protected]> wrote: > There is something very strange with memq vs member: > http://pasterack.org/pastes/80845 (note: I added one 0 to the loop > constants) > > I used two mutable variables eq?? and equal?? to avoid (most of) the > optimizations and I get that the time with equal? is 2x than the time > with eq?. This is closer to the range I expected. > > Using directly eq? and equal? is slightly faster, and the time is the > same because under the hood the optimizer transforms equal? to eq? > when one of the arguments is an explicit symbol. > > The implementation of member and memq is very short but very > entangled. I think that with some tweaks is possible to reduce the > time difference to x2, and with some luck to make it more optimizer > friendly and gain some additional speed. > > Gustavo > > > > On Thu, Sep 17, 2015 at 11:01 PM, Sam Tobin-Hochstadt > <[email protected]> wrote: >> Unfortunately, that's only true when eq? produces #t, which probably isn't >> an issue when using eq? directly, but can be when using memq or similar. >> This benchmark suggests about a 10x speed difference when the symbols are >> different: http://pasterack.org/pastes/94877 >> >> Sam >> >> >> On Thu, Sep 17, 2015, 9:52 PM Robby Findler <[email protected]> >> wrote: >>> >>> FWIW, if you use equal? in those cases, you'll get the same >>> performance behavior and you will have fewer eq?s to audit when things >>> go wonky. >>> >>> ;) >>> >>> Robby >>> >>> On Thu, Sep 17, 2015 at 8:36 PM, Neil Van Dyke <[email protected]> >>> wrote: >>> > Whew. :) I only rarely have a non-symbol use for `eq?`, but I use `eq?` >>> > heavily for symbols in everyday application code. >>> > >>> > Robby Findler wrote on 09/17/2015 09:27 PM: >>> >> >>> >> eq? on symbols is a special part of the specification and that seems >>> >> benign to me, all things considered. The "giant hash in the sky" that >>> >> makes sure that works isn't exactly trouble free, but we seem to have >>> >> it under control. >>> > >>> > >>> > -- >>> > You received this message because you are subscribed to the Google >>> > Groups >>> > "Racket Users" group. >>> > To unsubscribe from this group and stop receiving emails from it, send >>> > an >>> > email to [email protected]. >>> > For more options, visit https://groups.google.com/d/optout. >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Racket Users" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Racket Users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

