summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorS.H <gamelinks007@gmail.com>2021-02-20 04:11:19 +0900
committerGitHub <noreply@github.com>2021-02-19 11:11:19 -0800
commitefd19badf43f4f1f24d5aec8a28e94a6e1e47b5b (patch)
treed0f1b01082418d2434d5380cbb427bbccf095b6c
parent837e77e0202e96060498794ff97a097e5440d148 (diff)
downloadruby-efd19badf43f4f1f24d5aec8a28e94a6e1e47b5b.tar.gz
Improve performance some Numeric methods [Feature #17632] (#4190)
-rw-r--r--benchmark/numeric_methods.yml13
-rw-r--r--numeric.c58
-rw-r--r--numeric.rb46
3 files changed, 59 insertions, 58 deletions
diff --git a/benchmark/numeric_methods.yml b/benchmark/numeric_methods.yml
new file mode 100644
index 0000000000..433c2268a3
--- /dev/null
+++ b/benchmark/numeric_methods.yml
@@ -0,0 +1,13 @@
+prelude: |
+ int = 42
+ flo = 4.2
+benchmark:
+ real?: |
+ int.real?
+ integer?: |
+ flo.integer?
+ finite?: |
+ int.finite?
+ infinite?: |
+ int.infinite?
+loop_count: 20000000
diff --git a/numeric.c b/numeric.c
index bcc0ab7c61..167eed6068 100644
--- a/numeric.c
+++ b/numeric.c
@@ -712,35 +712,6 @@ num_divmod(VALUE x, VALUE y)
/*
* call-seq:
- * num.real? -> true or false
- *
- * Returns +true+ if +num+ is a real number (i.e. not Complex).
- */
-
-static VALUE
-num_real_p(VALUE num)
-{
- return Qtrue;
-}
-
-/*
- * call-seq:
- * num.integer? -> true or false
- *
- * Returns +true+ if +num+ is an Integer.
- *
- * 1.0.integer? #=> false
- * 1.integer? #=> true
- */
-
-static VALUE
-num_int_p(VALUE num)
-{
- return Qfalse;
-}
-
-/*
- * call-seq:
* num.abs -> numeric
* num.magnitude -> numeric
*
@@ -826,31 +797,6 @@ num_nonzero_p(VALUE num)
/*
* call-seq:
- * num.finite? -> true or false
- *
- * Returns +true+ if +num+ is a finite number, otherwise returns +false+.
- */
-static VALUE
-num_finite_p(VALUE num)
-{
- return Qtrue;
-}
-
-/*
- * call-seq:
- * num.infinite? -> -1, 1, or nil
- *
- * Returns +nil+, -1, or 1 depending on whether the value is
- * finite, <code>-Infinity</code>, or <code>+Infinity</code>.
- */
-static VALUE
-num_infinite_p(VALUE num)
-{
- return Qnil;
-}
-
-/*
- * call-seq:
* num.to_int -> integer
*
* Invokes the child class's +to_i+ method to convert +num+ to an integer.
@@ -5430,12 +5376,8 @@ Init_Numeric(void)
rb_define_method(rb_cNumeric, "magnitude", num_abs, 0);
rb_define_method(rb_cNumeric, "to_int", num_to_int, 0);
- rb_define_method(rb_cNumeric, "real?", num_real_p, 0);
- rb_define_method(rb_cNumeric, "integer?", num_int_p, 0);
rb_define_method(rb_cNumeric, "zero?", num_zero_p, 0);
rb_define_method(rb_cNumeric, "nonzero?", num_nonzero_p, 0);
- rb_define_method(rb_cNumeric, "finite?", num_finite_p, 0);
- rb_define_method(rb_cNumeric, "infinite?", num_infinite_p, 0);
rb_define_method(rb_cNumeric, "floor", num_floor, -1);
rb_define_method(rb_cNumeric, "ceil", num_ceil, -1);
diff --git a/numeric.rb b/numeric.rb
index 0746a83820..0c191c01c0 100644
--- a/numeric.rb
+++ b/numeric.rb
@@ -1,3 +1,49 @@
+class Numeric
+ #
+ # call-seq:
+ # num.real? -> true or false
+ #
+ # Returns +true+ if +num+ is a real number (i.e. not Complex).
+ #
+ def real?
+ return true
+ end
+
+ #
+ # call-seq:
+ # num.integer? -> true or false
+ #
+ # Returns +true+ if +num+ is an Integer.
+ #
+ # 1.0.integer? #=> false
+ # 1.integer? #=> true
+ #
+ def integer?
+ return false
+ end
+
+ #
+ # call-seq:
+ # num.finite? -> true or false
+ #
+ # Returns +true+ if +num+ is a finite number, otherwise returns +false+.
+ #
+ def finite?
+ return true
+ end
+
+ #
+ # call-seq:
+ # num.infinite? -> -1, 1, or nil
+ #
+ # Returns +nil+, -1, or 1 depending on whether the value is
+ # finite, <code>-Infinity</code>, or <code>+Infinity</code>.
+ #
+ def infinite?
+ return nil
+ end
+end
+
class Integer
# call-seq:
# -int -> integer