
// TimerRes.java
// Andrew Davison, April 2005, ad@fivedots.psu.ac.th

/* Měří rozlišení metody System.currentTimeMillis(),
   časovače z knihovny Java 3D, počítadla sun.misc.Perf a 
   nano-časovače z J2SE 5.0.

   Výsledky
   -------
   Win 98
      Rozlišení časovače Java 3D: 838 nanosekund
      Rozlišení systémového časovače Javy: 55000 mikrosekund
      Rozlišení počítadla Perf: 5866 nanosekund;  Čas počítadla Perf: 20114 nanosekund
      Rozlišení nano-časovače: 5657 nanosekund

   Win 2000
      Rozlišení časovače Java 3D: 838 nanosekund
      Rozlišení systémového časovače Javy: 10000 mikrosekund
      Rozlišení počítadla Perf: 6076 nanosekund;  Čas počítadla Perf: 38552 nanosekund

   Win XP
      Rozlišení časovače Java 3D: 279 nanosekund
      Rozlišení systémového časovače Javy: 15500 mikrosekund
      Rozlišení počítadla Perf: 1257 nanosekund;  Čas počítadla Perf: 10476 nanosekund

*/

import com.sun.j3d.utils.timer.J3DTimer;  // vyžaduje knihovnu Java 3D



public class TimerRes
{
  public static void main(String args[])
  { j3dTimeResolution();
    sysTimeResolution();
    perfTimeResolution();
    nanoTimeResolution();
  }
 
  private static void j3dTimeResolution()
  { System.out.println("Rozlišení časovače z knihovny Java 3D: " + 
                    J3DTimer.getResolution() + " nanosekund");
  }

  private static void sysTimeResolution() 
  {
    long total, count1, count2;

    count1 = System.currentTimeMillis();
    count2 = System.currentTimeMillis();
    while(count1 == count2)
      count2 = System.currentTimeMillis();
    total = 1000L * (count2 - count1);

    count1 = System.currentTimeMillis();
    count2 = System.currentTimeMillis();
    while(count1 == count2)
      count2 = System.currentTimeMillis();
    total += 1000L * (count2 - count1);

    count1 = System.currentTimeMillis();
    count2 = System.currentTimeMillis();
    while(count1 == count2)
      count2 = System.currentTimeMillis();
    total += 1000L * (count2 - count1);

    count1 = System.currentTimeMillis();
    count2 = System.currentTimeMillis();
    while(count1 == count2)
      count2 = System.currentTimeMillis();
    total += 1000L * (count2 - count1);

    System.out.println("Rozlišení systémového časovače Javy: " + total/4 + " mikrosekund");
  } // konec metody: sysTimeResolution()


  private static void perfTimeResolution()
  {
    StopWatch sw = new StopWatch();
    System.out.println("Rozlišení počítadla Perf: " + 
                    sw.getResolution() + " nanosekund");

    sw.start();
    long time = sw.stop();
    System.out.println("Čas počítadla Perf " + time  + " nanosekund");
  } // konec metody: perfTimeResolution()


  private static void nanoTimeResolution() 
  // Poznámka: Metoda System.nanoTime() je k dispozici od J2SE 5.0
  {
    long total, count1, count2;

    count1 = System.nanoTime();
    count2 = System.nanoTime();
    while(count1 == count2)
      count2 = System.nanoTime();
    total = (count2 - count1);

    count1 = System.nanoTime();
    count2 = System.nanoTime();
    while(count1 == count2)
      count2 = System.nanoTime();
    total += (count2 - count1);

    count1 = System.nanoTime();
    count2 = System.nanoTime();
    while(count1 == count2)
      count2 = System.nanoTime();
    total += (count2 - count1);

    count1 = System.nanoTime();
    count2 = System.nanoTime();
    while(count1 == count2)
      count2 = System.nanoTime();
    total += (count2 - count1);

    System.out.println("Rozlišení nano-časovače: " + total/4 + " nanosekund");
  } // konec metody: nanoTimeResolution()

} // konec třídy: TimerRes
