mirror of
https://github.com/wahyd4/gitlabhq.git
synced 2026-08-10 05:06:46 +10:00
Process.clock_gettime allows getting the real time in nanoseconds as
well as allowing one to get a monotonic timestamp. This offers greater
accuracy without the overhead of having to allocate a Time instance. In
general using Time.now/Time.new is about 2x slower than using
Process.clock_gettime(). For example:
require 'benchmark/ips'
Benchmark.ips do |bench|
bench.report 'Time.now' do
Time.now.to_f
end
bench.report 'clock_gettime' do
Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
end
bench.compare!
end
Running this benchmark gives:
Calculating -------------------------------------
Time.now 108.052k i/100ms
clock_gettime 125.984k i/100ms
-------------------------------------------------
Time.now 2.343M (± 7.1%) i/s - 11.670M
clock_gettime 4.979M (± 0.8%) i/s - 24.945M
Comparison:
clock_gettime: 4979393.8 i/s
Time.now: 2342986.8 i/s - 2.13x slower
Another benefit of using Process.clock_gettime() is that we can simplify
the code a bit since it can give timestamps in nanoseconds out of the
box.
63 lines
1.7 KiB
Ruby
63 lines
1.7 KiB
Ruby
module Gitlab
|
|
module Metrics
|
|
# Module for gathering system/process statistics such as the memory usage.
|
|
#
|
|
# This module relies on the /proc filesystem being available. If /proc is
|
|
# not available the methods of this module will be stubbed.
|
|
module System
|
|
if File.exist?('/proc')
|
|
# Returns the current process' memory usage in bytes.
|
|
def self.memory_usage
|
|
mem = 0
|
|
match = File.read('/proc/self/status').match(/VmRSS:\s+(\d+)/)
|
|
|
|
if match and match[1]
|
|
mem = match[1].to_f * 1024
|
|
end
|
|
|
|
mem
|
|
end
|
|
|
|
def self.file_descriptor_count
|
|
Dir.glob('/proc/self/fd/*').length
|
|
end
|
|
else
|
|
def self.memory_usage
|
|
0.0
|
|
end
|
|
|
|
def self.file_descriptor_count
|
|
0
|
|
end
|
|
end
|
|
|
|
# THREAD_CPUTIME is not supported on OS X
|
|
if Process.const_defined?(:CLOCK_THREAD_CPUTIME_ID)
|
|
def self.cpu_time
|
|
Process.
|
|
clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID, :millisecond).to_f
|
|
end
|
|
else
|
|
def self.cpu_time
|
|
Process.
|
|
clock_gettime(Process::CLOCK_PROCESS_CPUTIME_ID, :millisecond).to_f
|
|
end
|
|
end
|
|
|
|
# Returns the current real time in a given precision.
|
|
#
|
|
# Returns the time as a Float.
|
|
def self.real_time(precision = :millisecond)
|
|
Process.clock_gettime(Process::CLOCK_REALTIME, precision).to_f
|
|
end
|
|
|
|
# Returns the current monotonic clock time in a given precision.
|
|
#
|
|
# Returns the time as a Float.
|
|
def self.monotonic_time(precision = :millisecond)
|
|
Process.clock_gettime(Process::CLOCK_MONOTONIC, precision).to_f
|
|
end
|
|
end
|
|
end
|
|
end
|