2011-06-05 8 views
181

Quiero saber cuántos milisegundos requiere ejecutar un PHP for-loop.Forma precisa de medir los tiempos de ejecución de los scripts php

sé la estructura de un algoritmo genérico, pero ni idea de cómo ponerlo en práctica en PHP:

Begin 
init1 = timer(); // where timer() is the amount of milliseconds from midnight 
the loop begin 
some code 
the loop end 
total = timer() - init1; 
End 
+0

Puede ver alrededor de franjas de microtime() declaraciones si necesita esta en la producción, pero si es sólo para las pruebas, sólo tiene que utilizar [generador de perfiles de Xdebug] (http://www.xdebug.org/docs/profiler) por ejemplo. Ningún código desordenado es una ventaja real. – Wrikken

Respuesta

358

Usted puede utilizar la función de microtime para esto. De the documentation:

microtime - Devuelve la fecha Unix actual con microsegundos


Si get_as_float se establece en TRUE, entonces microtime() devuelve un flotador, que representa la hora actual en segundos desde la época Unix exacto el microsegundo más cercano.

Ejemplo de uso:

$start = microtime(true); 
while (...) { 

} 
$time_elapsed_secs = microtime(true) - $start; 
+29

Necesita 'microtime (verdadero)' si desea hacer cálculos con el valor de retorno. – lonesomeday

+6

Sé que esto es demasiado tarde (casi 4 años), pero como comentario ... el uso de estos cálculos (con el parámetro 'get_as_float' como' true') le dará resultados en ** segundos **, según PHP documentación. –

+0

@ AlejandroIván: no, no es así. get_as_float devolverá un FLOAT en lugar de un STRING para que puedas hacer cálculos con el valor de retorno ... comprueba http://php.net/manual/en/function.microtime.php: Si get_as_float está establecido en TRUE, entonces microtime() devuelve un flotante, que representa el tiempo actual en segundos desde la época de Unix precisa al microsegundo más cercano. – patrick

17
$start = microtime(true); 
for ($i = 0; $i < 10000; ++$i) { 
    // do something 
} 
$total = microtime(true) - $start; 
echo $total; 
5

Usted tiene la idea correcta, excepto una sincronización más precisa está disponible con la función microtime().

Si lo que hay dentro del ciclo es rápido, es posible que el tiempo aparente transcurrido sea cero. Si es así, envuelva otro ciclo alrededor del código y llámelo repetidamente. Asegúrese de dividir la diferencia entre el número de iteraciones para obtener una vez por vez. Tengo un código de perfil que requirió 10,000,000 de iteraciones para obtener resultados de sincronización consistentes y confiables.

23

Crear archivo loadtime.php

<?php 
class loadTime{ 
    private $time_start  = 0; 
    private $time_end  = 0; 
    private $time   = 0; 
    public function __construct(){ 
     $this->time_start= microtime(true); 
    } 
    public function __destruct(){ 
     $this->time_end = microtime(true); 
     $this->time = $this->time_end - $this->time_start; 
     echo "Loaded in $this->time seconds\n"; 
    } 
} 

que en el beggining de su script, después de <?php escritura include 'loadtime.php'; $loadtime=new loadTime();

Cuando la página se carga al final no se escribirá "cargado en x segundos"

+4

¡Aseado! Pero si no destruye explícitamente su objeto, la salida aparecerá después de la etiqueta de cierre 'que no es válida –

+0

@gondo No, será segundos (con microsegundos expresados ​​como valores decimales de segundos) – FrancescoMM

65

Puede usar microtime(true) de la siguiente manera:

Ponga esto al comienzo de su archivo PHP:

//place this before any script you want to calculate time 
$time_start = microtime(true); 

// su código de script va aquí

// do something 

Ponga esto al final de su archivo php:

// Display Script End time 
$time_end = microtime(true); 

//dividing with 60 will give the execution time in minutes other wise seconds 
$execution_time = ($time_end - $time_start)/60; 

//execution time of the script 
echo '<b>Total Execution Time:</b> '.$execution_time.' Mins'; 

Será salida que resultará en minutes.

53

Desde PHP 5.4 puedes usar $_SERVER["REQUEST_TIME_FLOAT"]. Contiene la marca de tiempo del inicio de la solicitud con una precisión de microsegundos.

$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; 

Fuente: http://php.net/manual/en/function.microtime.php

Esto le permite medir la ejecución del script con una sola línea de código, por ejemplo, colocándolo al final del guión.

+0

Esto es útil para saber . Por lo tanto, podría usar: '$ start = $ _SERVER [" REQUEST_TIME_FLOAT "]; $ myscript = microtime (verdadero); $ bootstrap = $ myscript - $ start; ...hacer cosas ...; $ myscripttime = microtime (true) - $ myscript; ' – pspahn

+1

Bueno, todo sobre cómo usar esto es que podrías hacer:' $ myscripttime = microtime (true) - $ _SERVER ["REQUEST_TIME_FLOAT"]; 'al final de tu secuencia de comandos sin tener que guardar una marca de tiempo al principio. – Iwazaru

+1

De acuerdo con la documentación vinculada, '$ time' contendrá la diferencia en _seconds_, no en _microseconds_. –

7

Aquí es una función que los tiempos de ejecución de cualquier pieza de código PHP, al igual que de Python módulo timeit hace: https://gist.github.com/flaviovs/35aab0e85852e548a60a

Cómo se usa:

include('timeit.php'); 
const SOME_CODE = ' 
     strlen("foo bar"); 
'; 
$t = timeit(SOME_CODE); 
print "$t[0] loops; $t[2] per loop\n"; 

Resultado:

$ php x.php 
100000 loops; 18.08us per loop 

Descargo de responsabilidad: soy el autor de este Gist

EDITAR: tiempo ahora es un proyecto independiente, autónomo en https://github.com/flaviovs/timeit

0

Aquí es muy simple y el método corto

<?php 
$time_start = microtime(true); 
//the loop begin 
//some code 
//the loop end 
$time_end = microtime(true); 
$total_time = $time_end - $time_start; 
echo $total_time; // or whatever u want to do with the time 
?> 
1

He aquí una aplicación que devuelve fracciones de segundo (es decir, 1.321 segundos)

/** 
* MICROSECOND STOPWATCH FOR PHP 
* 
* Class FnxStopwatch 
*/ 
class FnxStopwatch 
{ 
    /** @var float */ 
    private $start, 
      $stop; 

    public function start() 
    { 
     $this->start = self::microtime_float(); 
    } 
    public function stop() 
    { 
     $this->stop = self::microtime_float(); 
    } 
    public function getIntervalSeconds() : float 
    { 
     // NOT STARTED 
     if (empty($this->start)) 
      return 0; 
     // NOT STOPPED 
     if (empty($this->stop)) 
      return ($this->stop - self::microtime_float()); 

     return $interval = $this->stop - $this->start; 
    } 

    /** 
    * FOR MORE INFO SEE http://us.php.net/microtime 
    * 
    * @return float 
    */ 
    private static function microtime_float() : float 
    { 
     list($usec, $sec) = explode(" ", microtime()); 

     return ((float)$usec + (float)$sec); 
    } 
} 
Cuestiones relacionadas