mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
process.c: Use getrusage(2) in Process.times
if getrusage(2) is available, to improve precision of Process.times and its user like lib/benchmark.rb. On macOS, since getrusage(2) has better precision than times(3), they are much improved like: * Before Process.times => #<struct Process::Tms utime=0.56, stime=0.35, cutime=0.04, cstime=0.03> puts Benchmark.measure { "a" * 1_000_000_000 } 0.340000 0.310000 0.650000 ( 0.674025) * After Process.times => #<struct Process::Tms utime=0.561899, stime=0.35076, cutime=0.046483, cstime=0.038929> puts Benchmark.measure { "a" * 1_000_000_000 } 0.343223 0.310037 0.653260 ( 0.674025) On Linux, since struct rusage from getrusage(2) is used instead of struct tms from times(2), they are slightly improved like: * Before Process.times => #<struct Process::Tms utime=0.43, stime=0.11, cutime=0.0, cstime=0.0> puts Benchmark.measure { "a" * 1_000_000_000 } 0.120000 0.040000 0.170000 ( 0.171621) * After Process.times => #<struct Process::Tms utime=0.432, stime=0.116, cutime=0.0, cstime=0.0> puts Benchmark.measure { "a" * 1_000_000_000 } 0.124000 0.048000 0.172000 ( 0.171621) [ruby-dev:49471] [Feature #11952] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58935 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
109ccfdb2c
commit
253232c028
2 changed files with 16 additions and 1 deletions
4
NEWS
4
NEWS
|
@ -59,6 +59,10 @@ with all sufficient information, see the ChangeLog file or Redmine
|
||||||
of #coerce. Return nil in #coerce if the coercion is impossible.
|
of #coerce. Return nil in #coerce if the coercion is impossible.
|
||||||
[Feature #7688]
|
[Feature #7688]
|
||||||
|
|
||||||
|
* Process
|
||||||
|
|
||||||
|
* Precision of Process.times is improved if getrusage(2) exists. [Feature #11952]
|
||||||
|
|
||||||
* Range
|
* Range
|
||||||
* Range#initialize no longer rescue exceptions when comparing begin and
|
* Range#initialize no longer rescue exceptions when comparing begin and
|
||||||
end with #<=> and raise a "bad value for range" ArgumentError
|
end with #<=> and raise a "bad value for range" ArgumentError
|
||||||
|
|
13
process.c
13
process.c
|
@ -6887,15 +6887,26 @@ get_clk_tck(void)
|
||||||
VALUE
|
VALUE
|
||||||
rb_proc_times(VALUE obj)
|
rb_proc_times(VALUE obj)
|
||||||
{
|
{
|
||||||
|
VALUE utime, stime, cutime, cstime, ret;
|
||||||
|
#if defined(RUSAGE_SELF) && defined(RUSAGE_CHILDREN)
|
||||||
|
struct rusage usage_s, usage_c;
|
||||||
|
|
||||||
|
if (getrusage(RUSAGE_SELF, &usage_s) != 0 || getrusage(RUSAGE_CHILDREN, &usage_c) != 0)
|
||||||
|
rb_sys_fail("getrusage");
|
||||||
|
utime = DBL2NUM((double)usage_s.ru_utime.tv_sec + (double)usage_s.ru_utime.tv_usec/1e6);
|
||||||
|
stime = DBL2NUM((double)usage_s.ru_stime.tv_sec + (double)usage_s.ru_stime.tv_usec/1e6);
|
||||||
|
cutime = DBL2NUM((double)usage_c.ru_utime.tv_sec + (double)usage_c.ru_utime.tv_usec/1e6);
|
||||||
|
cstime = DBL2NUM((double)usage_c.ru_stime.tv_sec + (double)usage_c.ru_stime.tv_usec/1e6);
|
||||||
|
#else
|
||||||
const double hertz = get_clk_tck();
|
const double hertz = get_clk_tck();
|
||||||
struct tms buf;
|
struct tms buf;
|
||||||
VALUE utime, stime, cutime, cstime, ret;
|
|
||||||
|
|
||||||
times(&buf);
|
times(&buf);
|
||||||
utime = DBL2NUM(buf.tms_utime / hertz);
|
utime = DBL2NUM(buf.tms_utime / hertz);
|
||||||
stime = DBL2NUM(buf.tms_stime / hertz);
|
stime = DBL2NUM(buf.tms_stime / hertz);
|
||||||
cutime = DBL2NUM(buf.tms_cutime / hertz);
|
cutime = DBL2NUM(buf.tms_cutime / hertz);
|
||||||
cstime = DBL2NUM(buf.tms_cstime / hertz);
|
cstime = DBL2NUM(buf.tms_cstime / hertz);
|
||||||
|
#endif
|
||||||
ret = rb_struct_new(rb_cProcessTms, utime, stime, cutime, cstime);
|
ret = rb_struct_new(rb_cProcessTms, utime, stime, cutime, cstime);
|
||||||
RB_GC_GUARD(utime);
|
RB_GC_GUARD(utime);
|
||||||
RB_GC_GUARD(stime);
|
RB_GC_GUARD(stime);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue