From efd19badf43f4f1f24d5aec8a28e94a6e1e47b5b Mon Sep 17 00:00:00 2001 From: "S.H" Date: Sat, 20 Feb 2021 04:11:19 +0900 Subject: Improve performance some Numeric methods [Feature #17632] (#4190) --- benchmark/numeric_methods.yml | 13 ++++++++++ numeric.c | 58 ------------------------------------------- numeric.rb | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 58 deletions(-) create mode 100644 benchmark/numeric_methods.yml 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 @@ -710,35 +710,6 @@ num_divmod(VALUE x, VALUE y) return rb_assoc_new(num_div(x, y), num_modulo(x, 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 @@ -824,31 +795,6 @@ num_nonzero_p(VALUE num) return 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, -Infinity, or +Infinity. - */ -static VALUE -num_infinite_p(VALUE num) -{ - return Qnil; -} - /* * call-seq: * num.to_int -> 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, -Infinity, or +Infinity. + # + def infinite? + return nil + end +end + class Integer # call-seq: # -int -> integer -- cgit v1.2.1