From: "Eregon (Benoit Daloze)" <redmine@...> Date: 2013-07-21T19:15:38+09:00 Subject: [ruby-core:56102] [ruby-trunk - Feature #8658] Process.clock_gettime Issue #8658 has been updated by Eregon (Benoit Daloze). While I appreciate Ruby is not always taking the lowest common denominator for functionality (fork, etc), we need a counterpart for Windows and OS X at least. https://github.com/copiousfreetime/hitimes does it pretty nicely and I would really enjoy seeing the functionality to measure a precise interval in core. We should have a unified method for clock_gettime(), mach_absolute_time() and QueryPerformanceCounter(). Actually, I think it would be better to have an API allowing to have the time difference directly in seconds (higher level and the concern for allocating is no more relevant, any unit can be used internally). And this feature is not always compatible with the timestamp (given they are monotonic clocks), so I think there should be two separate methods. naruse gave a very useful link in #8096, http://www.python.org/dev/peps/pep-0418/ . I do not wish for a so large API, but I think we should have the timestamp functionality like time.time() and a precise performance counter like time.perf_counter(). I would be fine having the clock_id as a parameter for supporting platforms if it proves really useful. ---------------------------------------- Feature #8658: Process.clock_gettime https://bugs.ruby-lang.org/issues/8658#change-40598 Author: akr (Akira Tanaka) Status: Open Priority: Normal Assignee: Category: Target version: How about adding a new method, Process.clock_gettime(clk_id) ? Recently there were two feature request for measuring time. Feature #8640 https://bugs.ruby-lang.org/issues/8640 Feature #8096 https://bugs.ruby-lang.org/issues/8096 It seems they are somewhat different. clock_gettime() function defined by POSIX is a good candidate for providing as a method. I think it can supports the both request. Also, it has less possible design choices than the requests because clock_gettime() is defined by POSIX. People familiar to POSIX can learn the method more easily. I wrote a patch to implement Process.clock_gettime. This method can be used as follows. % ./ruby -e 'p Process.clock_gettime(Process::CLOCK_MONOTONIC)' 2701692957811563 Several considerations: I implemented the method as a module function of Process. It is same as Process.times. I expect clock_gettime is used mainly for measuring time interval and wall clock time is not important. So I didn't use Time. The method returns a number of nanoseconds as an integer. It is not so unexpected if user knows clock_gettime() in POSIX. clock_gettime() returns it as struct timespec which contains two fields: tv_sec and tv_nsec. Although tv_sec is time_t, Time is not appropriate because the origin (zero) can be other than the Epoch. Actually CLOCK_MONOTONIC means elapsed time since the system start-up time on Linux. Also, I expect the result is subtracted in most case: t1 = Process.clock_gettime(...) ... t2 = Process.clock_gettime(...) t = t2 - t1 So the result should be easy to subtract. An array such as [sec, nsec] is difficult to subtract. The result is an integer, not a float. IEEE 754 double is not enough to represent the result of clock_gettime(CLOCK_REALTIME). It contains 19 digits in decimal now but IEEE 754 double can represent only 15 digits. On LP64 systems, Fixnum can represent 2**62-1. So (2**62-1)/(365.25*24*60*60*1e9)=146.1 years are representable without object allocation. On ILP32 and LLP64 systems, Fixnum can represent 2**30-1. So (2**30-1)/1e9=1.07 seconds are representable without object allocation. This means Bignum allocations are mostly required except the origin is very recent. clock_gettime() is defined by POSIX. Linux, NetBSD, FreeBSD, OpenBSD has it, at least. If clock_gettime() is not available, an emulation layer for CLOCK_REALTIME is implementable using gettimeofday(). (not implemented yet, though.) Any comments? -- http://bugs.ruby-lang.org/