Skip to content

Commit

Permalink
time: Add EventTime#to_time for faster Time creation
Browse files Browse the repository at this point in the history
Fluent::EventTime can be converted into Time via Time.at but
this approach is slower. Output plugins sometimes require Time
for client libraries so adding faster method.

Warming up --------------------------------------
             to_time   171.865k i/100ms
             Time.at    92.733k i/100ms
Calculating -------------------------------------
             to_time      2.861M (± 5.1%) i/s -     14.265M in   5.002172s
             Time.at      1.184M (± 4.1%) i/s -      5.935M in   5.022106s

Signed-off-by: Masahiro Nakagawa <repeatedly@gmail.com>
  • Loading branch information
repeatedly committed Jun 21, 2019
1 parent 910ec4c commit 8c2aa63
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
13 changes: 13 additions & 0 deletions lib/fluent/time.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,19 @@ def to_s
@sec.to_s
end

begin
# ruby 2.5 or later
Time.at(0, 0, :nanosecond)

def to_time
Time.at(@sec, @nsec, :nanosecond)
end
rescue
def to_time
Time.at(@sec, @nsec / 1000.0)
end
end

def to_json(*args)
@sec.to_s
end
Expand Down
13 changes: 13 additions & 0 deletions test/test_event_time.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,19 @@ class EventTimeTest < Test::Unit::TestCase
assert_equal('100', "#{time}")
end

test '#to_time' do
time = Fluent::EventTime.new(@now.to_i, @now.nsec).to_time
assert_instance_of(Time, time)
assert_equal(@now.to_i, time.to_i)
begin
::Time.at(0, 0, :nanosecond)
assert_equal(@now.nsec, time.nsec)
rescue
# Time.at(@sec, @nsec / 1000.0) sometimes cause 1 diff error in nsec by 1000.0
assert_in_delta(@now.nsec, time.nsec, 1)
end
end

test '#to_json' do
time = Fluent::EventTime.new(100)
assert_equal('100', time.to_json)
Expand Down

0 comments on commit 8c2aa63

Please sign in to comment.