From: nobu@... Date: 2017-10-09T02:13:27+00:00 Subject: [ruby-dev:50283] [Ruby trunk Bug#13917] Comparable#clamp is slower than using Array#min, max. Issue #13917 has been updated by nobu (Nobuyoshi Nakada). It was same or slower with gcc 7.2.0. benchmark results: Execution time (sec) name |ruby 2.5.0dev (2017-10-08 trunk 60140) [x86_64-linux]|built-ruby -------------------------|----------------------------------------------------:|---------: comparable_object_between| 2.600| 2.736 comparable_object_clamp | 3.590| 3.579 comparable_object_less | 1.632| 1.679 Speedup ratio: compare with the result of `ruby 2.5.0dev (2017-10-08 trunk 60140) [x86_64-linux]' (greater is better) name |built-ruby -------------------------|---------: comparable_object_between| 0.950 comparable_object_clamp | 1.003 comparable_object_less | 0.972 ---------------------------------------- Bug #13917: Comparable#clamp is slower than using Array#min,max. https://bugs.ruby-lang.org/issues/13917#change-67121 * Author: kei-s (Kei Shiratsuchi) * Status: Assigned * Priority: Normal * Assignee: nobu (Nobuyoshi Nakada) * Target version: * ruby -v: * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- Comparable#clamp is slower than using Array#min,max. (I noticed it by @onk's tweet. https://twitter.com/onk/status/907856892604461056) ### Performance ``` user system total real minmax: 0.740000 0.000000 0.740000 ( 0.732744) clamp: 2.060000 0.010000 2.070000 ( 2.072794) ``` ### Test Code ``` require 'benchmark' Benchmark.bmbm do |x| v = Random.rand(-10..110) x.report "minmax:" do 10000000.times { [99, [0, v].max].min } end x.report "clamp: " do 10000000.times { v.clamp(0, 99) } end end ``` # Patch I made patch for it. But I'm not sure this is good way. https://gist.github.com/kei-s/b303aca105df5c26be9c98f833db80f7#file-compar-diff ## After ``` user system total real minmax: 0.820000 0.000000 0.820000 ( 0.822517) clamp: 1.090000 0.000000 1.090000 ( 1.087491) ``` Other benchmark for this patch is here. https://gist.github.com/kei-s/0c34cbe4e21a499601e8247077629082 ## Questions 1. Should `clamp` version be faster than `Array#min/max` version? `Array#min/max` version would have overhead of array creation. 2. Is `OPTIMIZED_CMP` in `cmpint` best way? Some method doesn't pass `cmpint` (e.g. `Integer#>`). But `OPTMIZED_CMP` checks Integer. -- https://bugs.ruby-lang.org/