Replace Range#include? to compare with start and end of range

Hi there,

I propose to replace the use of the method Range#include? to normal compared with the beginning and end of the range. For example consider the actually used method:

(11…13).include?(abs_number % 100)

and if we replace him to:

modulo_number = abs_number % 100

modulo_number >= 0) && (modulo_number <= 1)

it increase performance about 1.5 times.

This approach can be used in another real existing place.

Below are the benchmarks data:

Benchmark.ips do |x|

x.report(‘old_slow’) do

abs_number = 1234

(11..13).include?(abs_number % 100)

end

x.report(‘new_fast’) do

abs_number = 1234

modulo_number = abs_number % 100

(modulo_number >= 0) && (modulo_number <= 1)

end

x.compare!

end

Warming up --------------------------------------

        old_slow   257.215k i/100ms

        new_fast   334.191k i/100ms

Calculating -------------------------------------

        old_slow      5.628M (± 0.9%) i/s -     28.294M in   5.027572s

        new_fast      8.791M (± 0.9%) i/s -     44.113M in   5.018600s

Comparison:

        new_fast:  8790704.5 i/s

        old_slow:  5628188.6 i/s - 1.56x slower

Benchmark.ips do |x|

x.report(‘old_slow’) do

x = 0

(0…1).include?(0)

end

x.report(‘new_fast’) do

x = 0

(x >= 0) && (x <= 1)

end

x.compare!

end

Warming up --------------------------------------

        old_slow   283.858k i/100ms

        new_fast   367.498k i/100ms

Calculating -------------------------------------

        old_slow      6.133M (± 1.3%) i/s -     30.657M in   4.999708s

        new_fast     10.486M (± 1.6%) i/s -     52.552M in   5.012845s

Comparison:

        new_fast: 10486347.5 i/s

        old_slow:  6132780.2 i/s - 1.71x slower

What do you think about it?