例子:
$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.6s多一点
为什么 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.6s多一点
为什么 APC 这么慢?
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
)
)
这很奇怪,但似乎通过手动序列化,APC 将第一个和最后一个数据块拆分为更大的块,从而更好地处理内容。
这似乎不是一件微不足道的事情,因为我运行了几次这个测试,每次都得到类似的结果。