Project

General

Profile

Actions

Bug #15929

closed

Array#minmax is much slower than calling both #min and #max

Added by janosch-x (Janosch Müller) over 2 years ago. Updated over 2 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:93189]

Description

this is similar to issue 15807 about Ranges and maybe also to 13917

current situation:

  • calling Array#minmax incurs a performance penalty of almost 50% compared to calling both #min and #max
require 'benchmark/ips'
arr = (1..1000).map { rand }
Benchmark.ips do |x|
  x.report('min, max') { [arr.min, arr.max] }
  x.report('minmax')   { arr.minmax }
end
min, max  53.832k (± 1.8%) i/s -  270.861k in 5.033263s
  minmax  30.093k (± 1.2%) i/s -  151.980k in 5.051078s

background:

  • #minmax is included via Enumerable
  • Enumerable#minmax does not call array's optimized #min and #max implementations

possible solutions:

  • a) change Enumerable#minmax and let it rb_funcall min and max as suggested here (will also fix 15807)
  • b) implement minmax in array.c to call rb_ary_min and rb_ary_max

Files

array-minmax.patch (2.65 KB) array-minmax.patch jeremyevans0 (Jeremy Evans), 06/17/2019 06:47 PM
Actions

Also available in: Atom PDF