2012-10-14 11 views
6

例:APCシリアル化が遅い?

$arr = array(); 

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

apc_store('data', $arr); 

それは、15秒のようになります。データを取得するには、約0.7秒かかります。

私はPHPでデータをシリアル化し、apc_store('data', serialize($arr));でそれを保存すると1秒しかかかりません。

シリアライズされたデータを取得し、それをアンシリアライズするには、それは少しより0.6秒

なぜAPCはとても遅いですがかかりますか?

+0

'apc_store()'は '__sleep()'関数をトリガします。それが本当であれば、[関数はシリアル化の前に実行されます](http://php.net/manual/en/oop4.magic-functions.php)。多分効率が低下するでしょう。 'apc_store()'が既存のエントリを上書きするようにも聞こえます...私はまだPHPを学んでいますので、途方もないかもしれません。 – Rob

+0

@MikeDtrick:APCはシリアル化を使用しません。 'zval'構造体全体を(Cレベルで)コピーするだけです。 – Crozin

+0

@クロジン待って、何?これは '__sleep()'を起動する 'apc_store()'に関してですか?それは間違っていますか? – Rob

答えて

2

apc_sma_info()は、理由を説明する可能性のある興味深い情報を提供します。 apc_storeを実行

()非シリアル化されたデータは、block_listsインデックスは次の値で、私に生成して:

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

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

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

それらを手動でシリアライズしながらの生成:

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

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

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

それは好奇心旺盛です、手動のシリアライゼーションでは、より大きなブロックで最初と最後のデータを分割して、より良いコンテンツの配置を行うように見えます。

私はこのテストを数回実行したので、些細なことではないようです。毎回同様の結果が得られました。

関連する問題