2012-03-04 36 views
8

Estoy cargando archivos XML desde el disco usando file_get_contents, y como una prueba me parece que puedo cargar un archivo 156K usando file_get_contents() 1,000 veces en 3.99 segundos. He subclasificado la parte que hace la carga y la reemplacé con una capa de Memcache, y en mi máquina de desarrollo encuentro que puedo hacer 1000 cargas del mismo documento en 4.54 segundos.¿Por qué file_get_contents es más rápido que memcache_get?

Aprecio que file_get_contents() haga algo de almacenamiento en caché, pero parece que en realidad es más rápido que una conocida técnica de almacenamiento en caché. En un único servidor, ¿el rendimiento de file_get_contents() es tan bueno como se puede obtener?

Estoy en PHP 5.2.17 a través de Macports, OS X 10.6.8.

Editar: He encontrado en documentos XML de este tamaño, hay un pequeño beneficio en el uso de la bandera MEMCACHE_COMPRESSED. Se realizan 1.500 cargas a través de Memcache en 6.44 segundos (con compresión) en lugar de 6.74 (sin). Sin embargo, ambos son más lentos que file_get_contents, que hace la misma cantidad de cargas en 5,71 segundos.

Respuesta

8

Porque file_get_contents mmap es el archivo y solo tendrá unas pocas llamadas al sistema de archivos y esto terminará en la memoria caché del sistema de archivos. Memcache implica llamadas fuera del proceso a la memcached (y fuera del servidor en una implementación en clúster).

El rendimiento de file_get_contents() depende crucialmente del tipo de sistema de archivos, por ejemplo, un archivo en un sistema de archivos montado NFS no está mapeado y este acceso puede ser MUCHO más lento. También en un servidor multiusuario, la memoria caché del sistema de archivos puede ser barrida rápidamente por otros procesos, mientras que la memoria caché de memcached estará casi seguro en la memoria.

+0

Ah, interesante. ¿Estás diciendo que en un servidor web en el que se cargan varios archivos XML todo el tiempo, el rendimiento del enfoque de memcache _might_ en algunos casos será mejor? (Espero implementar en un VPS Linux de gama baja, probablemente con 512 MB de RAM, bastante gratis para el 64M predeterminado que Memcache reserva por defecto.) – halfer

+0

Aún así, me pregunto si la disputa que podría eliminar algo de la memoria caché de FS sería tan probable como eliminar algo de la memoria caché de Memcache ';-)' – halfer

+0

En un VPS que está dedicado a una aplicación, usted debería ser capaz de hacer que todo encaje Sin embargo, vale la pena "dimensionar correctamente" sus cachés: use 32M para Memcache o menos si eso es suficiente. Asegúrate de usar APC o Xcache si tu aplicación está basada en PHP. No olvide que puede obtener un buen dividendo de rendimiento si sintoniza los cachés de MySQL si usa MySQL, ... 512Mb es lo suficientemente pequeño como para asignarlo con prudencia. – TerryE

3

file_get_contents es la forma más sencilla de recuperar un archivo. El sistema operativo subyacente (especialmente Linux) ya tiene mecanismos de caché eficientes. Cualquier otra cosa que hagas solo crea sobrecarga y ralentiza las cosas.

Memcache tendría sentido si cargó estos archivos desde una ubicación remota.

Editar: No es necesariamente cierto que file_get_contents es la forma más sencilla. fopen/fget podría ser aún más rápido - No lo sé. Pero las diferencias deben ser menores en comparación con la complejidad de una capa de almacenamiento en caché.

+0

Espero que tengas razón. Supongo que esperaba 'file_get_contents' para realizar _some_ actividad de disco cada vez (tal vez para ver si un archivo ha cambiado), mientras que' memcache_get' no necesita ninguno. De ahí mi expectativa de que el enfoque de memcache sea más rápido ... sin embargo, no ha sido una pérdida de tiempo, ya que creo que acabo de aprender algo :) – halfer

+0

En un nivel muy generalizado, el caché FS hace lo mismo que tu PHP Memcache - excepto que es mucho más especializado y no está escrito en un lenguaje de scripting. :) La memoria caché no necesita acceder al archivo una segunda vez a menos que el contenido del archivo haya cambiado. Un mecanismo de caché por separado tendría sentido si hay mucha actividad IO en el sistema que vacía el caché de archivos. – Someone

+0

Un tick para @TerryE, a +1 para Mantriur, ambos muy útiles. Gracias. – halfer

1

Almacenar archivos XML en el Memcache tiene muy poco sentido para mí.

Prefiero almacenar valores analizados, lo que me permite leer y analizar.

+0

De hecho, esa fue mi intención original, hasta que descubrí que los objetos SimpleXML no se pueden serializar. Aparentemente contienen recursos, que por supuesto no se pueden representar adecuadamente en forma serializada. – halfer

+0

recursos? ¿Qué recursos? –

+0

Recursos: vea [esta respuesta] (http://stackoverflow.com/a/5264628/472495). – halfer

Cuestiones relacionadas