diff options
author | John Hawthorn <john@hawthorn.email> | 2022-01-11 09:10:23 -0800 |
---|---|---|
committer | John Hawthorn <john@hawthorn.email> | 2022-01-12 12:55:14 -0800 |
commit | 2f71f6bb82c561b0c0ac31b345673a6e6847efe3 (patch) | |
tree | 3a6e2c5e2239137b4208b1295dd5b8f49f15cdd2 /time.c | |
parent | ae5458f228a5477383e9c00425d85d50a3867817 (diff) | |
download | ruby-2f71f6bb82c561b0c0ac31b345673a6e6847efe3.tar.gz |
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
Diffstat (limited to 'time.c')
-rw-r--r-- | time.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -1932,6 +1932,13 @@ time_init_now(rb_execution_context_t *ec, VALUE time, VALUE zone) } 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) { struct time_object *tobj; |