Dear Wiki user, You have subscribed to a wiki page or wiki category on "Commons Wiki" for change notification.
The following page has been changed by nicolasDeLoof: http://wiki.apache.org/commons/Monitoring/Precision New page: = Performance monitoring precision = Monitoring application performance is a primary use case of commons-monitoring. Java provides 2 timers implementation, as [http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#currentTimeMillis() System.currentTimeMillis] and [http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#nanoTime() System.nanoTime()]. Those timers methods performances and real precision depends on the hardware, OS and JRE implementation. == MS Windows == Based on [http://blogs.sun.com/dholmes/entry/inside_the_hotspot_vm_clocks SUN] technical documentation, both implementation precision depend on underlying hardware. * {{{currentTimeMillis}}} uses a native windows low resolution timer, and for this reason is VERY quick (6 cycles), with a precision of only 10 to 15ms. Using this method as lower impacts on the application, but monitoring a process taking less than 15ms may produce elapsedTime=0 ! * {{{nanoTime}}} uses Windows Performance API (when available) that is both hardware and version (and service pack) dependent (user timers, ACPI timers or CPU-level timers...). In most cases, this requires slow I/O instruction and result in microsecond accuracy. In better case requesting an on-chip timer requires ~100 cycles. Both SUN JRE and Bea Jrockit implementation shows bad performances of {{{nanoTime}}} on Windows, but the {{{currentTimeMillis}}} precision is too limited for use as fine-grained performance counters. == Sun Solaris == On this platform, a quick & dirty bench [1] demonstrates both methods have comparable performances. No technical info on real precision, but {{{nanoTime}}} would give the better one available. == Other systems == ?? any info available ?? == Java 1.3 / Java 1.4 == backport-util-concurrent (used to backport commons-monitoring on pre-java5) provides an implementation of {{{System.nanoTime}}} that delegates to {{{currentTimeMillis}}} with unit conversion. On Sun JRE 1.4 it also uses an internal SUN performance package to get a better precision. == conclusion == Based on those informations, {{{currentTimeMillis}}} - even with nice performances on Windows - cannot be used for fine-grained monitoring. In all cases {{{nanoTime}}} provides the better time-counter available on the system, in terms of both precision and fiability [2] {{{#!java public class CurrentTimeMillisVsNanoTime { static int loops = 1000000; public static void main( String[] args ) { long time = System.nanoTime(); for ( int i = 0; i < loops; i++ ) { System.nanoTime(); } System.out.println( "System.nanoTime took : " + (System.nanoTime() - time) + "ns" ); time = System.nanoTime(); for ( int i = 0; i < loops; i++ ) { System.currentTimeMillis(); } System.out.println( "System.currentTimeMillis : " + (System.nanoTime() - time) + "ns" ); } } }}} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]