From: nobu@...
Date: 2015-01-28T23:40:10+00:00
Subject: [ruby-core:67872] [ruby-trunk - Feature #10785] [PATCH1/1] [ja/en] 特定のケースでMath.cを3倍速く / Make Math.c 3 times faster in a certain situation

Issue #10785 has been updated by Nobuyoshi Nakada.


gogo tanaka wrote:
> Nobuyoshi Nakada wrote:
> > I don't think this is a sane idea
> 
> Hmm.. I believe using `(double)FIX2LONG(x)` instead of `RFLOAT_VALUE(rb_to_float(x))` for `Fixnum` dose make sense.
> Could I ask more detail about that?

I meant "redefinition of Integer#to_f".

> > redefinition of Integer#to_f won't be ignored
> 
> I ensure every value will be applied to `DBL2NUM` before return, so I think there is no compatibility problem.
> Is this what you mean?

I meant:

~~~
$ ruby -v -e 'p Math.log(1);class Fixnum; def to_f; self+1.0;end;end;p Math.log(1)'
ruby 2.3.0dev (2015-01-26 trunk 49408) [universal.x86_64-darwin14]
0.0
-e:1: warning: method redefined; discarding old to_f
0.6931471805599453
~~~

Wannabe's tweet may help us.
http://twitter.com/wannabe53/status/560441249274933248

----------------------------------------
Feature #10785: [PATCH1/1] [ja/en] ���������������������Math.c���3��������� / Make Math.c 3 times faster in a certain situation
https://bugs.ruby-lang.org/issues/10785#change-51274

* Author: gogo tanaka
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
English follows japanese. Because my english is not good ;(

���������������������������������������������������.

`FIXNUM_P(x)`������������������������ `(double)FIX2LONG(x)` ��������������������������� `NUM2DBL(x)` ���C������������������������������������������.
���������������������������������������`Fixnum`, `Bignum`������������������������������������������������������������������������������������������.
���������������������������������������������������������������������������������������������������.
������������������������������������������������������������������������������������������������������������������������.

Hi, now I use `(double)FIX2LONG(x)` instead of `NUM2DBL(x)` when `FIXNUM_P(x)` is true.

I can found it make almost all Math's module_function faster about 3 times, 
only when arg(s) is `Fixnum` or `Bignum` object.

i feel like I make some mistakes, so please feel free to let me know.

������������������

    $ cat bench.rb
```
require 'benchmark'

puts Benchmark.measure { 10000000.times { Math.cos(1) } }
puts Benchmark.measure { 10000000.times { Math.cos((1 << 100)) } }
puts Benchmark.measure { 10000000.times { Math.cos(1.0) } }
puts Benchmark.measure { 10000000.times { Math.cos(1/3r) } }
```

# before
```
  4.280000   0.060000   4.340000 (  4.690771)
  7.000000   0.090000   7.090000 (  7.240859)
  1.430000   0.020000   1.450000 (  1.644737)
  5.950000   0.100000   6.050000 (  6.236341)
```

# after
```
  1.340000   0.000000   1.340000 (  1.359663)
  3.770000   0.050000   3.820000 (  3.917417)
  1.370000   0.010000   1.380000 (  1.395028)
  6.080000   0.070000   6.150000 (  6.255340)
```

---Files--------------------------------
refactoring_math_c.patch (6.97 KB)


-- 
https://bugs.ruby-lang.org/