brodieG / vetr

Trust, but Verify
78 stars 2 forks source link

Slow when first element in `||` compound exp fails #64

Closed brodieG closed 7 years ago

brodieG commented 7 years ago
vetr.sqr.num.mx <- quote(matrix(numeric(), 0) && ncol(.) == nrow(.))
vetr.sqr.num.mx.or.sclr.num <- quote(vetr.sqr.num.mx || numeric(1L))
vetr.sclr.num.or.sqr.num.mx <- quote(numeric(1L) || vetr.sqr.num.mx)

microbenchmark::microbenchmark(
  vet(vetr.sqr.num.mx.or.sclr.num, 1),
  vet(vetr.sclr.num.or.sqr.num.mx, 1)
)
Unit: microseconds
                                expr    min      lq     mean  median      uq
 vet(vetr.sqr.num.mx.or.sclr.num, 1) 38.854 42.5640 55.87488 44.4305 53.0145
 vet(vetr.sclr.num.or.sqr.num.mx, 1) 10.176 11.7585 15.52204 13.5075 14.5170
     max neval
 199.207   100
  72.581   100
brodieG commented 7 years ago

Seems like unfortunately a lot of the overhead is just the failing alike call:

> microbenchmark(alike(numeric(), NULL))
Unit: microseconds
                   expr    min     lq    mean median      uq     max neval
 alike(numeric(), NULL) 27.659 28.383 30.9083 28.725 29.2745 161.006   100

So really, we need to optimize that.

After we skip the ALIKEC_pad_or_quote bit:

Unit: microseconds
                   expr    min     lq     mean  median     uq     max neval
 alike(numeric(), NULL) 17.028 17.471 19.24952 17.6855 17.916 157.746   100

For reference, passing:

> microbenchmark(alike(numeric(), 1))
Unit: microseconds
                expr   min    lq    mean median     uq    max neval
 alike(numeric(), 1) 2.128 2.222 2.63623 2.2925 2.3835 32.608   100

Completely skipping all the stuff in _wrap after !success, still getting:

> microbenchmark(alike(numeric(), NULL))
Unit: microseconds
                   expr    min      lq     mean median      uq    max neval
 alike(numeric(), NULL) 15.456 15.9885 17.11938 16.211 16.6025 76.616   100