2012-10-14 11 views
6

przykład:Powtarzanie serii APC?

$arr = array(); 

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

apc_store('data', $arr); 

zajmuje jak 15 sekund. Aby uzyskać dane, zajmuje to około 0,7 s.

Ale jeśli serializuje dane za pomocą php i przechowuję je w ten sposób z apc_store('data', serialize($arr));, zajmuje to tylko 1 sekundę.

Aby uzyskać dane odcinkach, a następnie unserialize go, to zajmuje trochę więcej niż 0.6S

Dlaczego APC tak wolno?

+0

'apc_store()' uruchamia funkcję '__sleep()', prawda? Jeśli to prawda, to [funkcja jest uruchamiana przed serializacją] (http://php.net/manual/en/oop4.magic-functions.php). Może to zmniejsza wydajność. To również brzmi jak 'apc_store()' nadpisuje istniejące wpisy ... przyznane wciąż uczę się PHP, więc mogłem być daleko. – Rob

+0

@MikeDtrick: APC nie używa serializacji. Po prostu kopiuje całą strukturę 'zval' (na poziomie C). – Crozin

+0

@ Crozin Czekaj, co? Czy chodzi o 'apc_store()' wyzwalające '__sleep()'? Czy to jest nieprawidłowe? – Rob

Odpowiedz

2

apc_sma_info() dostarcza interesujących informacji, które być może mogłyby wyjaśnić, dlaczego tak się dzieje.

Wykonywanie apc_store() z non-serializowanym danych produkuje mi w block_lists indeks następujące wartości:

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

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

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

Podczas ich szeregowania ręcznie produkuje:

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

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

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

Jest to nowoczesny, ale wydaje się, że przy ręcznym serializowaniu, APC dzieli pierwsze i ostatnie fragmenty danych na większe bloki, czyniąc lepszą dyspozycję treści.

Nie wydaje się być czymś trywialnym, ponieważ przeprowadziłem ten test kilka razy i za każdym razem otrzymałem podobne wyniki.