aboutsummaryrefslogtreecommitdiffstats
path: root/time.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-04-10 18:08:16 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-04-10 18:08:16 +0000
commitfbc39bf28b26c0d01a175866c4872f39323b3943 (patch)
tree3ab6fb8f2a0d9e2883ca9f402a2e28dda5f2fe5a /time.c
parent829e61a512f89037ed38789b051556120eb5fc7b (diff)
downloadruby-fbc39bf28b26c0d01a175866c4872f39323b3943.tar.gz
time.c: Improve Time#to_i performance
Time#to_i will be faster around 80% (on 64-bit platforms). * Before user system total real 2.840000 0.000000 2.840000 ( 2.847238) * After user system total real 1.600000 0.000000 1.600000 ( 1.598911) * Test code require 'benchmark' Benchmark.bmbm do |x| x.report do t = Time.now 20000000.times do t.to_i end end end * time.c (_div): new function avoid rb_funcall (div): replace with new _div function [ruby-core:80636] [Bug #13418] Thanks to Watson <watson1978@gmail.com> for the patch. From: Watson <watson1978@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58308 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'time.c')
-rw-r--r--time.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/time.c b/time.c
index 0d93ec65ff..04c111a0c6 100644
--- a/time.c
+++ b/time.c
@@ -103,7 +103,17 @@ mul(VALUE x, VALUE y)
return rb_funcall(x, '*', 1, y);
}
-#define div(x,y) (rb_funcall((x), id_div, 1, (y)))
+static VALUE
+_div(VALUE x, VALUE y)
+{
+ if (FIXNUM_P(x) && FIXNUM_P(y)) {
+ return rb_fix_div_fix(x, y);
+ }
+ if (RB_TYPE_P(x, T_BIGNUM))
+ return rb_big_div(x, y);
+ return rb_funcall(x, id_div, 1, y);
+}
+#define div(x,y) _div(x,y)
static VALUE
mod(VALUE x, VALUE y)