2009-07-29 14 views

Respuesta

140

Tienes (al menos) dos soluciones:

El bastante "ingenuo" es usando microtime (verdadero) tobefore y después de una porción de código, para obtener la cantidad de tiempo que ha pasado durante su ejecución; otras respuestas dicen eso y ya dieron ejemplos, así que no voy a decir mucho más.

Esta es una buena solución si quiere comparar un par de instrucciones, como comparar dos tipos de funciones, por ejemplo, es mejor si miles hecho de veces, para asegurarse de que cualquier "elemento de perturbación" se promedia

Algo como esto, así que, si quieres saber cuánto tiempo se necesita para serializar una matriz:.

$before = microtime(true); 

for ($i=0 ; $i<100000 ; $i++) { 
    serialize($list); 
} 

$after = microtime(true); 
echo ($after-$before)/$i . " sec/serialize\n"; 

No es perfecto , pero útil, y no lleva mucho tiempo configurarlo.



La otra solución, que funciona bastante bien, si desea identificar qué función tiene un montón de tiempo en un guión completo, es utilizar:

  • La extensión Xdebug, para generar datos de creación de perfiles para el script
  • Software que lee los datos de creación de perfiles y le presenta algo legible. Sé tres de ésos:
    • Webgrind; interfaz web ; debería funcionar en cualquier servidor Apache + PHP
    • WinCacheGrind; solo en Windows
    • KCacheGrind; probablemente solo Linux y Linux; Esa es la que yo prefiero, por cierto

Para obtener perfiles de archivos, usted tiene que instalar y configurar Xdebug; Eche un vistazo a la página Profiling PHP Scripts de la documentación.

Lo que generalmente no se permitirá el generador de perfiles por defecto (genera archivos muy grandes, y ralentiza las cosas), pero el uso de la posibilidad de enviar un parámetro llamado XDEBUG_PROFILE como GET de datos, para activar los perfiles sólo para el página que necesito.
La parte relacionada con perfiles de mi php.ini tiene el siguiente aspecto:

xdebug.profiler_enable = 0    ; Profiling not activated by default 
xdebug.profiler_enable_trigger = 1  ; Profiling activated when requested by the GET parameter 
xdebug.profiler_output_dir = /tmp/ouput_directory 
xdebug.profiler_output_name = files_names 

(Lea la documentación para más información)

Esta pantalla es de un programa en C++ en kcachegrind: http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif
Obtendrá exactamente el mismo tipo de cosas con scripts PHP ;-)
(Con KCacheGrind, quiero decir, WinCacheGrind no es tan bueno como KCacheGrind ...)

Esto le permite obtener una buena visión de lo que lleva tiempo en su aplicación - y que a veces definitivamente ayuda a localizar la función que está desacelerando todo abajo ^^

Tenga en cuenta que Xdebug cuenta el tiempo de CPU empleado por PHP; cuando PHP está esperando una respuesta de una Base de Datos (por ejemplo), no está funcionando; solo esperando. ¡Entonces Xdebug pensará que la solicitud DB no toma mucho tiempo!
Esto debe ser perfilada en el servidor SQL, no PHP, así que ...


Hope esto es útil :-)
Que se diviertan!

+2

Muchas gracias ... – risyasin

+0

Existe una versión de Windows de QCacheGrind :-) https://sourceforge.net/projects/qcachegrindwin –

2

Si es algo que se puede probar fuera del contexto web, solo uso el comando Unix time.

+1

¿Qué pasa con las ventanas? –

29

Para la materia rápida hago esto (en PHP):

$startTime = microtime(true); 
doTask(); // whatever you want to time 
echo "Time: " . number_format((microtime(true) - $startTime), 4) . " Seconds\n"; 

También puede utilizar un generador de perfiles como http://xdebug.org/.

+2

Para una precisión adicional, sugiero (a) usar un ciclo y promediar el tiempo y (b) usar archivos separados para cada cosa que está probando. Si tiene varios tiempos dentro de un script, su orden puede hacer una diferencia a veces. – DisgruntledGoat

0

Puede usar elementos básicos como almacenar marcas de tiempo o microtime() antes y después de una operación para calcular el tiempo necesario. Eso es fácil de hacer, pero no muy preciso. Tal vez una mejor solución es Xdebug, nunca he trabajado con ella, pero parece ser el depurador/generador de perfiles de PHP más conocido que puedo encontrar.

2

Zend Studio tiene un soporte incorporado para el uso de XDebug o ZendDebugger. Perfilará su código, diciéndole exactamente cuánto tiempo tomó cada función. Es una herramienta fantástica para descubrir dónde están los cuellos de botella.

3

me gustaría compartir con ustedes una función de auto hecho que utilizo para medir la velocidad de cualquier función existente hasta 10 argumentos:

function fdump($f_name='', $f_args=array()){ 

    $f_dump=array(); 
    $f_result=''; 

    $f_success=false; 

    $f_start=microtime(); 
    $f_start=explode(' ', $f_start); 
    $f_start=$f_start[1] + $f_start[0]; 

    if(function_exists($f_name)){ 

     if(isset($f_args[0])&&is_array($f_args[0])){ 
      if($f_result=$f_name($f_args)){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[1])){ 
      if($f_result=$f_name($f_args[0])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[2])){ 
      if($f_result=$f_name($f_args[0],$f_args[1])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[3])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[4])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[5])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[6])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[7])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[8])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[9])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){ 
       $f_success=true; 
      } 
     } 
     elseif(!isset($f_args[10])){ 
      if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){ 
       $f_success=true; 
      } 
     } 
    } 
    $f_end=microtime(); 
    $f_end=explode(' ', $f_end); 
    $f_end=$f_end[1] + $f_end[0]; 

    $f_time=round(($f_end - $f_start), 4); 
    $f_dump['f_success']=$f_success; 
    $f_dump['f_time']=$f_time; 
    $f_dump['f_result']=$f_result; 

    var_dump($f_dump);exit; 

    //return $f_result; 

} 

Ejemplo

function do_stuff($arg1='', $arg2=''){ 
    return $arg1.' '.$arg2; 
} 

fdump('do_stuff',array('hello', 'world')); 

devoluciones

array(3) { 
    ["f_success"]=> 
    bool(true) 
    ["f_time"]=> 
    float(0)   //too fast... 
    ["f_result"]=> 
    string(11) "hello world" 
    } 
8

He hecho una clase de temporización simple, tal vez 'S útil para alguien:

class TimingHelper { 

    private $start; 

    public function __construct() { 
     $this->start = microtime(true); 
    } 

    public function start() { 
     $this->start = microtime(true); 
    } 

    public function segs() { 
     return microtime(true) - $this->start; 
    } 

    public function time() { 
     $segs = $this->segs(); 
     $days = floor($segs/86400); 
     $segs -= $days * 86400; 
     $hours = floor($segs/3600); 
     $segs -= $hours * 3600; 
     $mins = floor($segs/60); 
     $segs -= $mins * 60; 
     $microsegs = ($segs - floor($segs)) * 1000; 
     $segs = floor($segs); 

     return 
      (empty($days) ? "" : $days . "d ") . 
      (empty($hours) ? "" : $hours . "h ") . 
      (empty($mins) ? "" : $mins . "m ") . 
      $segs . "s " . 
      $microsegs . "ms"; 
    } 

} 

Uso:

$th = new TimingHelper(); 
<..code being mesured..> 
echo $th->time(); 
$th->start(); // if it's the case 
<..code being mesured..> 
echo $th->time(); 

// result: 4d 17h 34m 57s 0.00095367431640625ms 
+0

Ha escrito mal: es 'echo', no' $ echo' – SuN

+0

corregido, gracias –

3

Si desea rendimiento de la prueba rápida de un marco, que puede poner en index.php archivo

//at beginning 
$milliseconds = round(microtime(true) * 1000); 

//and at the end 
echo round(microtime(true) * 1000) - $milliseconds; 

Cada vez obtendrá tiempo de ejecución en milisegundos. Porque microsegundos no es demasiado útil para probar un caso de marco.

5

Aquí hay una respuesta directa a su pregunta

es un software para medir eso?

Sí, la hay. Me pregunto por qué nadie lo ha mencionado todavía. Aunque las respuestas sugeridas anteriormente parecen estar bien para un control rápido, pero no es escalable a largo plazo o para un proyecto más grande.

¿Por qué no utilizar una herramienta Application Performance Monitoring (APM) que está construida exactamente para eso y mucho más? Echa un vistazo a NewRelic, AppDynamics, Ruxit (todos tienen versión gratuita) para controlar el tiempo de ejecución, el uso de los recursos, el rendimiento de cada aplicación al nivel del método.

Cuestiones relacionadas