2012-03-04 5 views
8

Sto caricando file XML dal disco utilizzando file_get_contents, e come test trovo che posso caricare un file 156K utilizzando file_get_contents() 1.000 volte in 3.99 secondi. Ho sottoclassato la parte che fa il caricamento e l'ho sostituita con un livello memcache, e sulla mia macchina di sviluppo trovo che posso fare 1000 carichi dello stesso documento in 4,54 secondi.Perché file_get_contents è più veloce di memcache_get?

Apprezzo che file_get_contents() effettui un po 'di cache, ma sembra che sia in realtà più veloce di una nota tecnica di caching. Su un singolo server, le prestazioni di file_get_contents() sono buone?

Sono in PHP 5.2.17 tramite Macports, OS X 10.6.8.

Modifica: ho trovato su documenti XML di queste dimensioni, c'è un piccolo vantaggio nell'utilizzo del flag MEMCACHE_COMPRESSED. 1.500 carichi via memcache vengono eseguiti in 6.44 secondi (con compressione) anziché 6.74 (senza). Tuttavia entrambi sono più lenti di file_get_contents, che esegue lo stesso numero di carichi in 5.71 secondi.

risposta

8

Poiché file_get_contents mmap s il file e quindi si avranno solo alcune chiamate sul file system e questo finirà nella cache del file system. memcache implica chiamate out-of-process alla memcached (e al di fuori del server su un'implementazione cluster).

Le prestazioni di file_get_contents() dipendono in modo cruciale dal tipo di file system, ad esempio un file su un file system montato su NFS non viene stampato e questo accesso può essere molto più lento. Anche su un server multiutente, la cache del file system può essere rapidamente svuotata da altri processi mentre la cache memcached sarà quasi certamente in memoria.

+0

Ah, interessante. Stai dicendo che su un server web in cui vengono caricati vari file XML in ogni momento, le prestazioni dell'approccio memcache _might_ in alcuni casi sono migliori? (Prevedo di implementarlo su un VPS Linux di fascia bassa, probabilmente con 512 MB di RAM - molto gratuito per il 64M predefinito che memcache riserva per impostazione predefinita.) – halfer

+0

Tuttavia, mi chiedo se la contesa che farebbe uscire qualcosa dalla cache di FS equivarrebbe allo stesso modo a buttare fuori qualcosa dalla cache di memcache ';-)' – halfer

+0

Su un VPS dedicato ad una app, dovresti essere in grado di ottenere tutto per adattarsi. Comunque vale la pena "ridimensionare" le tue cache: usa 32M per memcache o meno se è abbastanza. Assicurati di utilizzare APC o Xcache se la tua app è basata su PHP. Non dimenticare che puoi ottenere un buon dividendo delle prestazioni dall'ottimizzazione delle cache MySQL se usi MySQL, ... 512 Mb è abbastanza piccolo da essere necessario allocare saggiamente. – TerryE

3

file_get_contents è il modo più semplice per recuperare un file. Il sistema operativo sottostante (specialmente linux) ha già meccanismi di caching efficienti. Tutto ciò che fai crea solo un sovraccarico e rallenta le cose.

Memcache avrebbe senso se si caricassero questi file da una posizione remota.

Modifica: Non è necessariamente vero che file_get_contents è il modo più semplice. fopen/fget potrebbe essere essere ancora più veloce - non lo so. Ma le differenze dovrebbero essere minori rispetto alla complessità di un livello di memorizzazione nella cache.

+0

Mi aspetto che tu abbia ragione. Immagino che mi aspettassi 'file_get_contents' per eseguire ogni volta l'attività del disco su qualcuno (forse per vedere se un file è stato modificato), mentre' memcache_get' non ne ha bisogno. Da qui la mia aspettativa che l'approccio memcache sarebbe più veloce ... tuttavia non è stata una perdita di tempo, dal momento che penso di aver appena imparato qualcosa :) – halfer

+0

Su un livello molto generalizzato la cache di FS fa la stessa cosa del tuo PHP memcache - eccetto che è molto più specializzato e non scritto in un linguaggio di scripting. :) La cache non ha bisogno di accedere al file una seconda volta a meno che il contenuto del file non sia cambiato. Un meccanismo di caching separato avrebbe senso se c'è un sacco di attività di I/O sul sistema che scarica la cache dei file. – Someone

+0

Un segno di spunta per @TerryE, un +1 per Mantriur - entrambi molto utili. Grazie. – halfer

1

La memorizzazione di file XML nel memcache ha poco senso per me.

Preferisco memorizzare valori analizzati, risparmiando sia la lettura che l'analisi.

+0

Infatti, questa era la mia intenzione originale - fino a quando ho scoperto che gli oggetti SimpleXML non possono essere serializzati. Apparentemente contengono risorse, che ovviamente non possono essere adeguatamente rappresentate in forma serializzata. – halfer

+0

risorse? quali risorse? –

+0

Risorse: vedere [questa risposta] (http://stackoverflow.com/a/5264628/472495). – halfer