/** <p>Titre : MesureDeDuree.java </p>
 * <p>Description : Emploi d'une classe abstraite pour mesurer la durée effective d'exécution</p>
 * <p>Copyright : (c) ~/2a env. ESSTIN  </p>
 * @author   H. Nguyen-Phu
 * @version 1.3  10.10.2009
 * @since   1.0  16.01.2003
 */
import java.io.*;

/** <p>MesureDeDuree : classe abstraite </p>  */
public abstract class MesureDeDuree  {

/** Kmax :  champ protégé de classe de type ENTIER <=> ce facteur d'amplification doit être adapté dans dans la sous-classe pour que Duree totale >> 50 ms ! */
	protected static int  Kmax;
/** res :  champ protégé de classe de type ENTIER LONG <=> résultat attendu de la mesure effective de la durée d'exécution  */
	protected static long res;
/** jo : champ protégé de classe de type 'PrintWriter' <=> alias de 'System.out' pour JDK 1.4 et antérieure ... */
        protected static PrintWriter jo = new PrintWriter(System.out, true);


        /**  Déclaration de la méthode abstraite 'TraitementAMesurer'
         * @return un entier long
         */
	abstract long TraitementAMesurer();

        /** Déclaration et définition de la méthode 'TraitementAVide'
         * @return un entier long
         */
	long TraitementAVide()  {// pour mesurer la durée résiduelle (version 'long')
	 return 0L;
	}

        /**  Constructeur 'MesureDeDuree' sans argument    */
        MesureDeDuree()  	{
 	 long dateDeb, dateFin;

	 int Km = Integer.MAX_VALUE;

	 dateDeb = System.currentTimeMillis();
	   for(int i=0; i<Km; i++)
	   	res = TraitementAVide();
	 dateFin = System.currentTimeMillis();

	 double T_res = (double) (dateFin-dateDeb)/Km/1000d;

	 jo.println("Duree re'siduelle = "+ (dateFin-dateDeb) +" ms => T_res = "+T_res+" s !");

	 dateDeb = System.currentTimeMillis();
	   for(int i=0; i<Kmax; i++)
		   res = TraitementAMesurer();
	 dateFin = System.currentTimeMillis();

	 jo.printf("Duree totale ('System.currentTimeMillis()') = %d  ms", (dateFin-dateDeb));
	 jo.printf("\n\t\t=> Dure'e effective = %8.2f nanoseconde(s)\n\n", ((double) (dateFin-dateDeb)/Kmax/1000d - T_res)*1e+09);
	}
}
