From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: clogger-public@bogomips.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 43ABA200D0 for ; Fri, 27 Feb 2015 22:45:10 +0000 (UTC) From: Eric Wong To: clogger-public@bogomips.org Subject: [PATCH 2/2] pure: use monotonic clock if possible Date: Fri, 27 Feb 2015 22:45:07 +0000 Message-Id: <1425077107-25270-3-git-send-email-e@80x24.org> In-Reply-To: <1425077107-25270-1-git-send-email-e@80x24.org> References: <1425077107-25270-1-git-send-email-e@80x24.org> List-Id: Ruby 2.1.0 and later exposes Process.clock_gettime, resulting in less garbage and access to the monotonic clock if it is available. Try to use it to achieve feature parity with the C extension (which has always used the monotonic clock if possible). --- lib/clogger/pure.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/clogger/pure.rb b/lib/clogger/pure.rb index 9efb00c..5e7ccfe 100644 --- a/lib/clogger/pure.rb +++ b/lib/clogger/pure.rb @@ -28,7 +28,7 @@ def initialize(app, opts = {}) end def call(env) - start = Time.now + start = mono_now resp = @app.call(env) unless resp.instance_of?(Array) && resp.size == 3 log(env, 500, {}, start) @@ -165,7 +165,7 @@ def log(env, status, headers, start = @start) when OP_TIME_LOCAL; Time.now.strftime(op[1]) when OP_TIME_UTC; Time.now.utc.strftime(op[1]) when OP_REQUEST_TIME - t = Time.now - start + t = mono_now - start time_format(t.to_i, (t - t.to_i) * 1000000, op[1], op[2]) when OP_TIME t = Time.now @@ -185,4 +185,14 @@ def log(env, status, headers, start = @start) end nil end + + # favor monotonic clock if possible, and try to use clock_gettime in + # more recent Rubies since it generates less garbage + if defined?(Process::CLOCK_MONOTONIC) + def mono_now; Process.clock_gettime(Process::CLOCK_MONOTONIC); end + elsif defined?(Process::CLOCK_REALTIME) + def mono_now; Process.clock_gettime(Process::CLOCK_REALTIME); end + else + def mono_now; Time.now.to_f; end + end end -- EW