<?php
    
class Benchmark
    
{
        private 
$test;
        private 
$nb_init;
        private 
$nb_exec_per_init;
        private 
$start;
        private 
$end;
        private 
$nb_exec 0;
        private 
$exec_time 0;

        public function 
__construct(Test $test) {
            
$this->test $test;
        }

        public function 
perform($nb_init$nb_exec_per_init) {
            
$this->nb_init $nb_init;
            
$this->nb_exec_per_init $nb_exec_per_init;
            
$this->start microtime(true);
            
$i 0;
            while(
$i $nb_init) {
                
$this->test->init();
                
                
$start_exec microtime(true);
                
                
$j 0;
                while(
$j $nb_exec_per_init) {
                    
$this->test->execute();
                    
$this->nb_exec++;
                    
$j++;
                }

                
$end_exec microtime(true);
                
$this->exec_time += ($end_exec $start_exec);

                
$this->test->finalize();
                
$i++;
            }
            
$this->end microtime(true);
        }

        public function 
display_statistics() {
            echo 
"\n========================\n";
            echo 
"Test : {$this->test->get_test_name()}\n";
            echo 
"Initialization : {$this->nb_init} times\n";
            echo 
"Exec per init  : {$this->nb_exec_per_init} times\n\n";

            echo 
"Total time      : ".number_format($this->end $this->start6',''')." s\n";
            echo 
"Total exec      : {$this->nb_exec}\n";
            echo 
"Total exec time : ".number_format($this->exec_time6',''')." s\n";
            echo 
"\n========================\n";
        }

        public function 
get_statistics() {
            return array(
'nb_init'=>$this->nb_init'nb_exec'=>$this->nb_exec'total_time'=>($this->end $this->start), 'exec_time'=>$this->exec_time);
        }
    }
?>