[racket-dev] member like assoc
On 2013-05-31 19:40:52 -0400, Asumu Takikawa wrote:
> Is it feasible to get `member` to have the same optional argument
> behavior as `assoc`? That is, to have an equality predicate as the third
> argument.
I went ahead and implemented this behavior and submitted a pull request:
https://github.com/plt/racket/pull/366
To see if the change is "pay as you go", I ran some microbenchmarks to
see if old-style `member` calls would slow down (see below). There
doesn't seem to be any significant slow-down AFAICT.
I was surprised that the non-JIT version was faster in the first case
but much slower in the second microbenchmark though. (note: I had to
change the C implementation of `member` for the non-JIT path)
I'd appreciate any suggestions on the code.
Cheers,
Asumu
;;; NEW BRANCH
$ racket member-benchmark.rkt
cpu time: 1748 real time: 1752 gc time: 0
$ racket --no-jit member-benchmark.rkt
cpu time: 1524 real time: 1526 gc time: 0
;;; MASTER
$ racket member-benchmark.rkt
cpu time: 1712 real time: 1716 gc time: 0
$ racket --no-jit member-benchmark.rkt
cpu time: 1524 real time: 1528 gc time: 0
The microbenchmark is just this:
#lang racket/base
(require (only-in racket/list range))
(define lst (range 1 5000))
(time
(for ([i 30000])
(member 2500 lst)))
On a slightly different microbenchmark:
;;; NEW BRANCH
$ racket member-benchmark-2.rkt
cpu time: 2396 real time: 2402 gc time: 0
$ racket --no-jit member-benchmark-2.rkt
cpu time: 7156 real time: 7174 gc time: 0
;;; MASTER
$ racket member-benchmark-2.rkt
cpu time: 2412 real time: 2416 gc time: 0
$ racket --no-jit member-benchmark-2.rkt
cpu time: 6892 real time: 6911 gc time: 0
#lang racket/base
(define lst '(a b c))
(time
(for ([i 30000000])
(member 'b lst)))