Project

General

Profile

Actions

Bug #13519

closed

Improve performance of some Time methods

Added by watson1978 (Shizuo Fujita) almost 7 years ago. Updated almost 7 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:80915]

Description

This is related to https://bugs.ruby-lang.org/issues/13503

Some Time methods will call internal quov() function and
quov() calls Numeric#quo -> Rational#quo -> ...

This patch will add rb_numeric_quo() as internal C API to call Numeric#quo directly.
And this will use rb_numeric_quo() instead of rb_funcall() for Numeric#quo to internal objects.

Time#- will be faster around 15%.

Before

Calculating -------------------------------------
         Time#subsec      2.029M (± 8.6%) i/s -     10.078M in   5.003036s
              Time#-      4.225M (± 2.1%) i/s -     21.130M in   5.003600s
           Time#to_f      5.580M (± 2.1%) i/s -     27.955M in   5.011881s
           Time#to_r      1.862M (± 9.8%) i/s -      9.253M in   5.016749s

After

Calculating -------------------------------------
         Time#subsec      2.196M (±10.7%) i/s -     10.879M in   5.010285s
              Time#-      4.991M (± 2.2%) i/s -     24.966M in   5.005041s
           Time#to_f      6.809M (±13.5%) i/s -     32.204M in   5.005536s
           Time#to_r      1.980M (± 9.6%) i/s -      9.854M in   5.020879s

Test code

require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "Time#subsec" do |t|
    time = Time.now
    t.times { time.subsec }
  end

  x.report "Time#-" do |t|
    time1 = Time.now
    time2 = Time.now
    t.times { time1 - time2 }
  end

  x.report "Time#to_f" do |t|
    time = Time.now
    t.times { time.to_f }
  end

  x.report "Time#to_r" do |t|
    time = Time.now
    t.times { time.to_r }
  end
end

Patch

https://github.com/ruby/ruby/pull/1601

Actions

Also available in: Atom PDF

Like0
Like0Like0