2012-10-14 22 views
6

Esempio:Serializzazione APC lenta?

$arr = array(); 

for($i = 5; $i < 300000; $i++) 
    $arr[$i] = 'foo'; 

apc_store('data', $arr); 

Prende come 15 secondi. Per ottenere i dati ci vogliono circa 0,7 secondi.

Ma se serializzo i dati con php e lo memorizza in questo modo con apc_store('data', serialize($arr)); ci vuole solo 1 secondo.

per ottenere i dati serializzati e poi unserialize esso, ci vuole un po 'più di 0.6s

Perché APC così lento?

+0

'apc_store()' attiva la funzione '__sleep()', giusto? Se ciò è vero, la [funzione viene eseguita prima della serializzazione] (http://php.net/manual/en/oop4.magic-functions.php). Forse questo riduce l'efficienza. Sembra anche che 'apc_store()' sovrascriva le voci esistenti ... garantito sto ancora imparando PHP così potrei essere lontano. – Rob

+0

@MikeDtrick: APC non utilizza la serializzazione. Copia solo l'intera struttura 'zval' (a livello C). – Crozin

+0

@Crozin Aspetta, cosa? Riguarda 'apc_store()' attivando '__sleep()'? È sbagliato? – Rob

risposta

2

apc_sma_info() fornisce una informazione interessante che, forse, potrebbe spiegare perché accade.

Esecuzione apc_store() con dati non serializzati produce a me, in block_lists indice i seguenti valori:

Array 
(
    [0] => Array 
     (
      [size] => 608 
      [offset] => 33152 
     ) 

    [1] => Array 
     (
      [size] => 5589032 
      [offset] => 11211992 
     ) 

    [2] => Array 
     (
      [size] => 2175976 
      [offset] => 31378408 
     ) 
) 

Mentre loro serializzazione produce manualmente:

Array 
    (
     [0] => Array 
      (
       [size] => 11178232 
       [offset] => 33760 
      ) 

     [1] => Array 
      (
       [size] => 1210040 
       [offset] => 16801024 
      ) 

     [2] => Array 
      (
       [size] => 15542104 
       [offset] => 18012280 
      ) 
    ) 

È curioso, ma sembra che con una serializzazione manuale, APC divida il primo e l'ultimo pezzo di dati in blocchi più grandi, facendo una migliore disposizione dei contenuti.

Non sembra essere banale perché ho eseguito questo test un paio di volte e ho ottenuto risultati simili ogni volta.