2010-11-04 12 views
7

Hice algunas pruebas para comparar y medir la velocidad de ambas funciones. is_file parece ser varias veces más rápido (utilicé 10000 iteraciones para ambos) que file_exists. Me pregunto si PHP u OS usarán alguna memoria caché para estas funciones o si siempre tiene acceso a la unidad de disco duro. Creo que no, pero me pregunto ...is_file/file_exists rendimiento y caché

que utiliza este código:

<?php 
$time = microtime(); 
$time = explode(' ', $time); 
$begintime = $time[1] + $time[0]; 
for($i=0;$i<10000;$i++) 
    file_exists('/Applications/MAMP/htdocs/index.php'); 
$time = microtime(); 
$time = explode(" ", $time); 
$endtime = $time[1] + $time[0]; 
$totaltime = ($endtime - $begintime); 
echo 'PHP parsed this in ' .$totaltime. ' seconds.</br>'; 
$time = microtime(); 
$time = explode(" ", $time); 
$begintime = $time[1] + $time[0]; 
for($i=0;$i<10000;$i++) 
    is_file('/Applications/MAMP/htdocs/index.php'); 
$time = microtime(); 
$time = explode(" ", $time); 
$endtime = $time[1] + $time[0]; 
$totaltime = ($endtime - $begintime); 
echo 'PHP parsed this in ' .$totaltime. ' seconds.</br>'; 
?> 
+3

¿Está llamando esto muchas veces en un circuito cerrado (donde este efecto dominará el tiempo de solicitud)? Si no, no me preocuparía a menos que estés seguro de que te está causando un problema de rendimiento ... Recuerda que 'la optimización prematura es la raíz de todo mal '... Usa la alternativa semánticamente mejor hasta que sepas que es un problema y luego optimice entonces y solo entonces ... – ircmaxell

+0

De hecho, is_file() es 10 veces más rápido que file_exists()! Lo intenté, y es verdad. – forthrin

+0

Si ayuda a alguien, podemos agregar que file_exists() devolverá true para ambos directorios y archivos que existen, donde is_file() solo devolverá true si es un archivo (y existe, por supuesto). – aesede

Respuesta

8

Cuando se utiliza stat(), lstat(), o cualquier de las otras funciones que figuran en el lista de funciones afectadas (a continuación), PHP almacena en caché la información de esas funciones return para proporcionar un rendimiento más rápido . Sin embargo, en ciertos casos , es posible que desee borrar la información almacenada en caché . Por ejemplo, si el mismo archivo se está comprobando varias veces dentro de una sola escritura, y que el archivo está en peligro de ser eliminado o modificado durante la operación que de la escritura, usted puede optar por borrar la caché de estado. En estos casos , puede usar la función clearstatcache() para borrar la información que PHP almacena en caché sobre un archivo .

funciones afectadas incluyen stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime() , fileatime(), filemtime(), fileinode(), grupo de archivos(), propietario de archivo(), filesize(), filetype() y fileperms().

+2

Pero ambas funciones están en esa lista, por lo que no parece explicar por qué una sería mucho más rápida que la otra. – thomasrutter

+3

Primero ejecuta la prueba 'file_exists()', que tiene que hacer la lectura real desde el disco y almacenarla en statcache; luego ejecutas el 'is_file()' que simplemente lee la entrada statcache que ya ha sido poblada por la comprobación 'file_exists()', por lo que (como es lógico) es mucho más rápida. Vacíe el caché entre las pruebas, y luego probará 'is_file()' con precisión porque tendrá que verificar el disco y poblar el caché de la misma manera que 'file_exists()' lo hizo –

+0

Su respuesta ... fue demasiado malditamente lento. Velar por que esto sea mejorado;) – thomasrutter

9

cachés PHP tanto is_file() y file_exists() en la memoria caché de estadísticas. Llame al clearstatcache() para borrarlo.

Editar:
En todo caso, los dos deben tomar cantidades similares de tiempo, ya que tanto llaman el sistema operativo de stat() function, pero los resultados de uno puede ser almacenado en caché para el otro por PHP (a menos que clearstatcache()) o por el sistema operativo como Yuliy menciona a continuación.

+2

Tenga en cuenta que las mediciones de rendimiento en las operaciones de archivos pueden variar debido al caché del sistema de archivos del sistema operativo – Yuliy

+0

'strace' muestra que file_exists llama' access ("foo", F_OK) 'while' is_file' hace 'stat (" foo ", 0x7fffe720a8a0)' – Bell

2

is_file y file_exists son dos funciones diferentes que hacen dos cosas diferentes; file_exists solo verifica si el archivo existe, is_file indica si el destino es un archivo válido y (por ejemplo) no un directorio.

Ellos no debería ser usado por el mismo objetivo, por lo que la comparación de rendimiento no puedo hacer (en mi humilde opinión)

+0

esto no es del todo correcto. sin embargo, las funciones fueron diseñadas, el objetivo es lograr el resultado deseado. en este caso, tanto is_file() como file_exists() devuelven falso si el archivo no existe. y los puntos de referencia demuestran que usar is_file() le dará a su aplicación una ventaja sobre una aplicación similar usando file_exists(). – stillstanding

+0

@stillstanding: ¿Pero de qué tipo de borde estamos hablando? Como el disco 'stat()' va a ser la parte más lenta, me sorprendería que los dos difieran en más de uno o dos por ciento. Después de todo, ambos usan los mismos datos, uno solo regresa antes (y ambos solo deberían hacer una llamada al sistema) ... Al menos eso es lo que entiendo de todos modos ... – ircmaxell

+0

@stillstanding: ¿Qué puntos de referencia? Creo que 'file_exists' sería un poco más rápido, ya que no tiene que verificar si la [estructura estadística] (http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/stat.h.html) 's 'mode_t' contiene S_IFDIR o no. – Powerlord

Cuestiones relacionadas