¿Cómo puedo decir qué clase de muchos (que todos hacen el mismo trabajo) ejecutan más rápido? hay un software para medir eso?¿Cómo puedo medir la velocidad del código escrito en PHP?
Respuesta
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!
Si es algo que se puede probar fuera del contexto web, solo uso el comando Unix time
.
¿Qué pasa con las ventanas? –
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/.
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
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.
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.
He estado usando XHProf últimamente http://pecl.php.net/package/xhprof. Originalmente fue desarrollado por Facebook y viene con una interfaz web decente.
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"
}
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
Ha escrito mal: es 'echo', no' $ echo' – SuN
corregido, gracias –
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.
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.
- 1. ¿Cómo puedo medir la velocidad del código escrito en Java? (Algoritmos AI)
- 2. medir la velocidad de código en .NET en milisegundos
- 3. ¿Cómo puedo medir las estadísticas del código fuente?
- 4. ¿Cómo puedo medir cómo se escala el código multiproceso (aceleración)?
- 5. Medir la cobertura del código solo en el nuevo código
- 6. ¿Cómo medir el rendimiento del código en .NET?
- 7. ¿Cómo puedo aumentar la velocidad del cursor en la terminal?
- 8. ¿Cómo medir # de líneas de código en el proyecto?
- 9. ¿Cómo puedo determinar la velocidad de CodeIgniter?
- 10. ¿Aumenta la velocidad de PHP?
- 11. ¿Cómo puedo obtener la velocidad de red actual del iPhone?
- 12. ¿Cómo detectar la velocidad de Internet en PHP?
- 13. ¿Cómo es posible vender código escrito en un idioma interpretado?
- 14. Analizador de SSI escrito en PHP?
- 15. Obtenga la velocidad de rotación del disco Código de muestra
- 16. La mejor manera de medir la velocidad de descarga en iPhone usando el toque de cacao
- 17. ¿Cómo puedo medir puntos de distancia diagonales?
- 18. PHP velocidad usort
- 19. Establecer la velocidad del ventilador en C#
- 20. ¿Cómo puedo medir la profundidad de la pila de hilos?
- 21. Prueba de velocidad de PHP para la velocidad de conexión del usuario sin eco en la página actual
- 22. Velocidad de PHP vs JavaScript?
- 23. ¿Algún IDE de PHP escrito en C?
- 24. ¿Cómo puedo medir la similitud entre 2 cadenas?
- 25. ¿Cómo puedo medir la similitud entre dos imágenes?
- 26. Limite la velocidad de descarga usando PHP
- 27. ¿Cómo medir la contención mutex?
- 28. Python vs velocidad de PHP
- 29. Código de administración Escrito para aprender
- 30. ¿Cómo medir la carga actual del servidor MySQL?
Muchas gracias ... – risyasin
Existe una versión de Windows de QCacheGrind :-) https://sourceforge.net/projects/qcachegrindwin –