mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Speed up and avoid kwarg hash alloc in Time.now
Previously Time.now was switched to use Time.new as it added support for the in: argument. Unfortunately because Class#new is a cfunc this requires always allocating a Hash. This commit switches Time.now back to using a builtin time_s_now. This avoids the extra Hash allocation and is about 3x faster. $ benchmark-driver -e './ruby;3.1::~/.rubies/ruby-3.1.0/bin/ruby;3.0::~/.rubies/ruby-3.0.2/bin/ruby' benchmark/time_now.yml Warming up -------------------------------------- Time.now 6.704M i/s - 6.710M times in 1.000814s (149.16ns/i, 328clocks/i) Time.now(in: "+09:00") 2.003M i/s - 2.112M times in 1.054330s (499.31ns/i) Calculating ------------------------------------- ./ruby 3.1 3.0 Time.now 7.693M 2.763M 6.394M i/s - 20.113M times in 2.614428s 7.278710s 3.145572s Time.now(in: "+09:00") 2.030M 1.260M 1.617M i/s - 6.008M times in 2.960132s 4.769378s 3.716537s Comparison: Time.now ./ruby: 7693129.7 i/s 3.0: 6394109.2 i/s - 1.20x slower 3.1: 2763282.5 i/s - 2.78x slower Time.now(in: "+09:00") ./ruby: 2029757.4 i/s 3.0: 1616652.3 i/s - 1.26x slower 3.1: 1259776.2 i/s - 1.61x slower
This commit is contained in:
parent
ae5458f228
commit
2f71f6bb82
Notes:
git
2022-01-13 05:55:33 +09:00
3 changed files with 11 additions and 1 deletions
3
benchmark/time_now.yml
Normal file
3
benchmark/time_now.yml
Normal file
|
@ -0,0 +1,3 @@
|
|||
benchmark:
|
||||
- 'Time.now'
|
||||
- 'Time.now(in: "+09:00")'
|
7
time.c
7
time.c
|
@ -1931,6 +1931,13 @@ time_init_now(rb_execution_context_t *ec, VALUE time, VALUE zone)
|
|||
return time;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
time_s_now(rb_execution_context_t *ec, VALUE klass, VALUE zone)
|
||||
{
|
||||
VALUE t = time_s_alloc(klass);
|
||||
return time_init_now(ec, t, zone);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
time_set_utc_offset(VALUE time, VALUE off)
|
||||
{
|
||||
|
|
2
timev.rb
2
timev.rb
|
@ -221,7 +221,7 @@ class Time
|
|||
# Parameter:
|
||||
# :include: doc/time/in.rdoc
|
||||
def self.now(in: nil)
|
||||
new(in: Primitive.arg!(:in))
|
||||
Primitive.time_s_now(Primitive.arg!(:in))
|
||||
end
|
||||
|
||||
# _Time_
|
||||
|
|
Loading…
Add table
Reference in a new issue