Use Hotspot-specific features for calculating CPU time when available
---------------------------------------------------------------------

                 Key: JRUBY-5380
                 URL: http://jira.codehaus.org/browse/JRUBY-5380
             Project: JRuby
          Issue Type: Improvement
          Components: Core Classes/Modules
    Affects Versions: JRuby 1.6RC1
            Reporter: Charles Oliver Nutter
             Fix For: JRuby 1.7


It turns out there's a special OperatingSystemMXBean on Hotspot that provides a 
way to get actual full-process CPU time. The patch below utilizes it, but 
probably would not work on non-Hotspot JVMs unless they license the same code.

{noformat}
diff --git a/src/org/jruby/RubyProcess.java b/src/org/jruby/RubyProcess.java
index 4d16468..7382a38 100644
--- a/src/org/jruby/RubyProcess.java
+++ b/src/org/jruby/RubyProcess.java
@@ -30,6 +30,7 @@
 package org.jruby;
 
 import com.kenai.constantine.platform.Errno;
+import com.sun.management.UnixOperatingSystemMXBean;
 import org.jruby.anno.JRubyClass;
 import org.jruby.anno.JRubyMethod;
 import org.jruby.anno.JRubyModule;
@@ -919,12 +920,14 @@ public class RubyProcess {
     public static IRubyObject times(ThreadContext context, IRubyObject recv, 
Block unusedBlock) {
         return times(context.getRuntime());
     }
+
+    private static final UnixOperatingSystemMXBean threadBean = 
(UnixOperatingSystemMXBean)sun.management.ManagementFactory.getOperatingSystemMXBean();
+    
     public static IRubyObject times(Ruby runtime) {
-        double currentTime = System.currentTimeMillis() / 1000.0;
-        double startTime = runtime.getStartTime() / 1000.0;
+        double userTime = threadBean.getProcessCpuTime() / 1000000000.0;
         RubyFloat zero = runtime.newFloat(0.0);
         return RubyStruct.newStruct(runtime.getTmsStruct(), 
-                new IRubyObject[] { runtime.newFloat(currentTime - startTime), 
zero, zero, zero }, 
+                new IRubyObject[] { runtime.newFloat(userTime), zero, zero, 
zero },
                 Block.NULL_BLOCK);
     }
{noformat}

It would be great to make this fix and have our CPU times actually reflect 
something in reality, rather than just using wall clock for everything.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to