使用前缀或后缀的apcu_fetch()查找速度是否更快


Is apcu_fetch() lookup faster with prefix or suffix?

场景:-使用APCu的少数PHP项目(例如网站(。每一个都由一个唯一的id/hash标识,例如可以是20个字符长。我们在下面称之为$site_hash。-每个项目都存储大量存储在APCu中的小值,这些值由键标识。

通常情况下,人们会通过使用这样的缓存密钥来区分条目:

$value = apcu_fetch($site_hash . '|' . $key);

但有人可能会这样做:

$value = apcu_fetch($key . '|' . $site_hash);

人们可能会认为第二个更快,因为像这样,哈希表查找通常只需要查看前几个字符。

有人能证实这个假设吗?

(我确信我可以自己做这个实验。如果我做了,我会在这里分享。(

即使函数使用哈希表,两种方法也可能比另一种更快。我解释:

如果$site_hash在$key之前使用,则速度取决于第一个字符的ASCII值(如果字符串以"z"开头,则速度将比以"a"开头慢(。

如果它以$key开头,问题也会一样。

我确实运行了一个基准测试。

<?php
function apcutest($prepend = FALSE) {
  apcu_clear_cache();
  $prefix = $suffix = __FILE__ . __FILE__ . __FILE__;
  $keys = [];
  for ($i = 0; $i < 100000; ++$i) {
    apcu_store(
      $keys[] = $prepend
        ? $prefix . $i
        : $i . $suffix,
      md5("($i)"));
  }
  $t0 = microtime(TRUE);
  foreach ($keys as $key) {
    apcu_fetch($key);
    apcu_fetch($key);
    apcu_fetch($key);
    apcu_fetch($key);
    apcu_fetch($key);
    apcu_fetch($key);
    apcu_fetch($key);
    apcu_fetch($key);
    apcu_fetch($key);
    apcu_fetch($key);
  }
  $t1 = microtime(TRUE);
  return ($t1 - $t0) * 1000;
}
$dts = [];
$dts[] = apcutest(FALSE);
$dts[] = apcutest(TRUE);
$dts[] = apcutest(FALSE);
$dts[] = apcutest(TRUE);
$dts[] = apcutest(FALSE);
$dts[] = apcutest(TRUE);
print_r($dts);

我的机器上的结果:

Array
(
    [0] => 415.98796844482
    [1] => 413.39302062988
    [2] => 414.03603553772
    [3] => 415.08793830872
    [4] => 413.25092315674
    [5] => 414.61896896362
)

观察结果:在几次运行中,带有后缀的版本似乎有一个非常小但一致的优势。然而,随后的运行并没有证实这一点。对于这个实验,两者之间没有统计学上显著的可测量差异。

结论:根据这个实验,使用前缀还是后缀并不重要。这可能不是最终的答案,但这是我此时能给出的答案。我想知道这个查找是如何实现的。