/**
 * <p>Titre : MesureDeDuree2.java </p>
 * <p>Description : Emploi d'une classe abstraite pour comparer deux durées effectives d'exécution</p>
 * <p>Copyright : (c) ~/2a env. ESSTIN  </p>
 * @author   H. Nguyen-Phu
 * @version 1.2  06.03.2005
 * @since   1.0  16.01.2003
 */
import java.io.*;

/**
 * <p>MesureDeDuree : classe abstraite </p>
 * contient un champ unique pour le résultat 'res'
 */
public abstract class MesureDeDuree2  {

	protected static int  Kmax;
// Kmax: facteur d'amplification à modifier t.q. Duree totale >> 50 ms !
	protected static double res1, res2;
// res1 et res2:  résultats attendus de type réel double

        protected static double d_eff1, d_eff2;
// durées effectives des deux algorithmes ...

        public static PrintWriter jsor = new PrintWriter(System.out, true);

        /**
         * Déclaration de la méthode abstraite 'TraitementAMesurer1'
         * @return un réel double
         */
	abstract double TraitementAMesurer1();

         /**
          * Déclaration de la méthode abstraite 'TraitementAMesurer2'
          * @return un réel double
          */
         abstract double TraitementAMesurer2();

        /**
         * Déclaration et définition de la méthode 'TraitementAVide'
         * @return un réel double
         */
	double TraitementAVide()  {// pour mesurer la durée résiduelle (version 'long')
	 return 0d;
	}

        /**
         * Constructeur 'MesureDeDuree' sans argument
         */
        MesureDeDuree2()  	{
 	 long dateDeb, dateFin;

	 int Km = Integer.MAX_VALUE/10;

	 dateDeb = System.currentTimeMillis();
	   for(int i=0; i<Km; i++)
	   	res1 = TraitementAVide();
	 dateFin = System.currentTimeMillis();

	 double T_res = (double) (dateFin-dateDeb)/Km/1000d;

	 jsor.printf("Duree re'siduelle = %d ms => T_res = %9.2e sec. !\n", (dateFin-dateDeb), T_res);

	 dateDeb = System.currentTimeMillis();
	   for(int i=0; i<Kmax; i++)
		   res1 = TraitementAMesurer1();
	 dateFin = System.currentTimeMillis();
	 jsor.print("Duree totale 1 = "+ (dateFin-dateDeb) + " ms !");
         d_eff1 = (double) (dateFin-dateDeb)/Kmax/1000d - T_res;
	 jsor.printf(" => Duree effective 1 = %10.3e  sec. !\n", d_eff1);

         dateDeb = System.currentTimeMillis();
           for(int i=0; i<Kmax; i++)
                   res2 = TraitementAMesurer2();
         dateFin = System.currentTimeMillis();
         jsor.print("Duree totale 2 =  "+ (dateFin-dateDeb) + " ms !");
         d_eff2 = (double) (dateFin-dateDeb)/Kmax/1000d - T_res;
         jsor.printf(" => Duree effective 2 = %10.3e  sec. !\n", d_eff2);

         jsor.printf("\nD'ou`  le rapport de dure'es :   d_eff1/d_eff2 =  %8.2f !\n\n", d_eff1/d_eff2);

	}
}
