Project

General

Profile

Actions

Feature #13507

open

Improve performance of some Complex methods where call Numeric#real? internally

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

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:80857]

Description

Some Complex methods call Numeric#real? at f_real_p() using rb_funcall().
This patch will provide optimization in f_real_p() when Integer/Float is given as internal objects.

Before

Calculating -------------------------------------
           Complex#+      5.226M (± 3.9%) i/s -     26.145M in   5.011147s
           Complex#-      5.274M (± 4.4%) i/s -     26.321M in   5.001267s
           Complex#*      3.217M (± 4.7%) i/s -     16.092M in   5.013429s

After

Calculating -------------------------------------
           Complex#+      6.925M (± 5.4%) i/s -     34.559M in   5.006583s
           Complex#-      7.124M (± 4.8%) i/s -     35.652M in   5.017364s
           Complex#*      3.880M (± 4.1%) i/s -     19.363M in   5.000170s

Test code

require 'benchmark/ips'

Benchmark.ips do |x|
  c1 = Complex(2, 3)
  c2 = Complex(2, 3)

  x.report "Complex#+" do |t|
    t.times { c1 + c2 }
  end

  x.report "Complex#-" do |t|
    t.times { c1 - c2 }
  end

  x.report "Complex#*" do |t|
    t.times { c1 * c2 }
  end

end

Patch

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

Actions

Also available in: Atom PDF

Like0
Like0Like0