September 2000
Intermediate to advanced
442 pages
13h 10m
English
I
measured timings of the three Counter classes in
the previous section using another class,
CounterTest. This timing class illustrates some
pitfalls you need to avoid when timing multithreaded applications, so
I’ll go into a little detail about the
CounterTest definition.
The first naive implementation of CounterTest is
quite simple. Just create a Thread subclass with
the run()
method running timed tests of the
classes you are measuring. You need an extra instance variable for
the Counter3 class, so the class can be defined
as:
package tuning.threads; public class CounterTest extends Thread { //instance variable to specify which thread we are. int num; public CounterTest(int threadnum) { super( ); num = threadnum; } // main forks four threads public static void main(String[] args) { int REPEAT = (args.length > 0) ? Integer.parseInt(args[0]) : 10000000; for (int i = 0; i < 4; i++) (new CounterTest(i)).start( ); } public void run( ) { Counter1.initialize(0); long time = System.currentTimeMillis( ); for (int i = REPEAT; i > 0; i--) Counter1.addAmount(0, 1); System.out.println("Counter1 count: " + Counter1.getAmount(0) + " time: " + (System.currentTimeMillis( )-time)); Counter2.initialize(0); time = System.currentTimeMillis( ); for (int i = REPEAT; i > 0; i--) Counter2.addAmount(0, 1); System.out.println("Counter2 count: " + Counter2.getAmount(0) + " time: " + (System.currentTimeMillis( )-time)); Counter3.initialize(this); time = System.currentTimeMillis( ...Read now
Unlock full access