Warum ist file_get_contents schneller als memcache_get?

8

Ich lade XML-Dateien mit file_get_contents von der Festplatte, und als Test kann ich eine 156K-Datei mit file_get_contents() 1.000 mal in 3,99 Sekunden laden. Ich habe den Teil, der das Laden durchführt, subklassifiziert und durch einen Memcache-Layer ersetzt, und auf meinem Dev-Computer finde ich, dass ich 1000 Ladevorgänge desselben Dokuments in 4,54 Sekunden ausführen kann.

Ich schätze, dass file_get_contents () etwas Caching durchführt, aber es sieht so aus, als wäre es tatsächlich schneller als eine bekannte Caching-Technik. Ist auf einem einzelnen Server die Leistung von file_get_contents() so gut wie möglich?

Ich bin auf PHP 5.2.17 über Macports, OS X 10.6.8.

Bearbeiten: Ich habe auf XML-Dokumenten dieser Größe gefunden, es gibt einen kleinen Vorteil bei der Verwendung der MEMCACHE_COMPRESSED -Flagge. 1.500 Ladungen via Memcache werden in 6,44 Sekunden (mit Kompression) anstatt 6,74 (ohne) durchgeführt. Beide sind jedoch langsamer als file_get_contents , was die gleiche Anzahl an Ladevorgängen in 5,71 Sekunden ergibt.

    
halfer 04.03.2012, 14:28
quelle

3 Antworten

8

Weil file_get_contents mmap s die Datei ist und Sie nur ein paar Dateisystemaufrufe haben, wird dies im Dateisystem-Cache landen. Bei memcache werden Out-of-Process-Aufrufe an memcached (und bei einer Clusterimplementierung außerhalb des Servers) ausgeführt.

Die Leistung von file_get_contents() hängt entscheidend vom Typ des Dateisystems ab, zum Beispiel wird eine Datei in einem NFS-Dateisystem nicht gemappt und dieser Zugriff kann viel langsamer sein. Auch auf einem Mehrbenutzerserver kann der Dateisystemcache durch andere Prozesse schnell geleert werden, während der Memcached-Cache fast sicher im Speicher ist.

    
TerryE 04.03.2012, 14:44
quelle
3

file_get_contents ist der einfachste Weg, eine Datei abzurufen. Das zugrundeliegende Betriebssystem (insbesondere Linux) verfügt bereits über effiziente Caching-Mechanismen. Alles andere, was du tust, erzeugt nur Overhead und verlangsamt die Dinge.

Memcache würde Sinn machen, wenn Sie diese Dateien von einem entfernten Ort geladen haben.

Edit: Es ist nicht unbedingt wahr, dass file_get_contents der einfachste Weg ist. fopen / fget könnte noch schneller sein - ich weiß es nicht. Aber die Unterschiede sollten im Vergleich zur Komplexität einer Caching-Schicht gering sein.

    
Someone 04.03.2012 14:43
quelle
1

Das Speichern von XML-Dateien im Memcache macht für mich wenig Sinn.

Ich würde lieber geparste Werte speichern und mir sowohl das Lesen als auch das Parsen ersparen.

    
Your Common Sense 04.03.2012 15:29
quelle