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; }
3.142.135.249