High-Resolution Timers

Problem

You need to time how long something takes.

Solution

Call System.getTimeMillis( ) twice, and subtract the first result from the second result.

Discussion

Needing a timer is such a common thing that, instead of making you depend on some external library, the developers of Java have built it in. The System class contains a static method that returns the current time (since 1970) in milliseconds. Thus, to time some event, use this:

long start = System.getTimeMillis(  ); 
method_to_be_timed(  ); 
long end = System.getTimeMillis(  ); l
ong elapsed = end - start;    // time in msec.

Here is a short example to measure how long it takes a user to press return. We divide the time in milliseconds by a thousand to get seconds, and print it nicely using a NumberFormat:

// Timer0.java 
long t0, t1; 
System.out.println("Press return when ready"); 
t0=System.currentTimeMillis(  ); 
int b; 
do { 
    b = System.in.read(  ); 
} while (b!='
' && b != '
'),

t1=System.currentTimeMillis(  ); 
double deltaT = t1-t0; 
System.out.println("You took " +  
    DecimalFormat.getInstance(  ).format(deltaT/1000.) + " seconds.");

This longer example uses the same technique, but computes a large number of square roots and writes each one to a discard file using the getDevNull( ) method from Section 2.5:

import java.io.*; 
import java.text.*; 
 
/** 
 * Timer for processing sqrt and I/O operations. 
 */ 
public class Timer { 
    public static void main(String argv[]) { 
        try { 
            new Timer().run(  ); 
        } catch (IOException e) { 
            System.err.println(e); 
        } 
    } 
    public void run(  ) throws IOException { 
 
        DataOutputStream n = new DataOutputStream( 
            new BufferedOutputStream(new FileOutputStream(SysDep.getDevNull(  )))); 
        long t0, t1; 
        System.out.println("Java Starts at " + (t0=System.currentTimeMillis(  ))); 
        double k; 
        for (int i=0; i<100000; i++) { 
            k = 2.1 * Math.sqrt((double)i); 
            n.writeDouble(k); 
        } 
        System.out.println("Java Ends at " + (t1=System.currentTimeMillis(  ))); 
        double deltaT = t1-t0; 
        System.out.println("This run took " +  
            DecimalFormat.getInstance(  ).format(deltaT/1000.) + " seconds."); 
    } 
}

Finally, this code shows a simpler, but less portable, technique for formatting a “delta t” or time difference. It works only for the English locale (or any other where the number one-and-a-half is written “1.5”), but it’s simple enough to write the code inline. I show it here as a method for completeness, and confess to having used it this way on occasion:

/** Convert a long ("time_t") to seconds and thousandths. */
public static String msToSecs(long t) {
    return t/1000 + "." + t%1000;
}
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.142.135.249