From: Tadashi Saito Date: 2005-08-06T16:24:55+09:00 Subject: [ruby-dev:26754] Re: Fixnum演算メソッド中のcoerceの削減 斎藤と申します。 On Wed, 3 Aug 2005 14:32:01 +0900 Yukihiro Matsumoto wrote: > この辺は手を抜いていただけなのでパッチは助かります。取り込も > うと思います(HEADに)。 ありがとうございます。不完全でいろいろとすみませんでした。 一度パッチを取りこんでいただいた後で恐縮なのですが、高速化が 可能ではないかという部分に一つ気づきました。staticな関数である fix_div(x, y)のyがBignumであるとき、「x.abs < y.abs」は常に 成立すると考えてもよいのでしょうか。仮に上記が正しいとすると、 以下のようなかなりの簡略化が適用できるのではないでしょうか。 検討をお願いします。 Index: numeric.c =================================================================== RCS file: /src/ruby/numeric.c,v retrieving revision 1.124 diff -u -p -r1.124 numeric.c --- numeric.c 4 Aug 2005 11:29:51 -0000 1.124 +++ numeric.c 4 Aug 2005 23:30:49 -0000 @@ -2152,8 +2152,11 @@ fix_div(x, y) } switch (TYPE(y)) { case T_BIGNUM: - x = rb_int2big(FIX2LONG(x)); - return rb_big_div(x, y); + if ((FIX2LONG(x) > 0 && !RBIGNUM(y)->sign) || + (FIX2LONG(x) < 0 && RBIGNUM(y)->sign)) { + return INT2FIX(-1); + } + return INT2FIX(0); case T_FLOAT: return rb_float_new((double)FIX2LONG(x) / RFLOAT(y)->value); default: -- 斎藤ただし # 勘違いならすみません…