使用前缀或后缀,apcu_fetch()查找速度更快吗?

时间:2016-09-26 11:43:08

标签: php hashtable apcu

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

通常可以使用缓存键区分条目,如下所示:

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

但有人可能会这样做:

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

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

有人可以证实这个假设吗?

(我相信我可以自己运行这个实验。如果我这样做,我会在这里分享。)

2 个答案:

答案 0 :(得分:0)

即使该函数使用哈希表,您的两种方法都可以比另一种方法更快。我解释一下:

如果在$ key之前使用$ site_hash,那么速度取决于第一个字符的ASCII值(如果字符串以' z'开头,它将比以&开头的速度慢) #39;一个'。)

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

答案 1 :(得分:0)

我做了一个基准测试。

<?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
)

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

结论: 根据此实验,使用前缀或后缀无关紧要。 这可能不是最终答案,但这是我现在可以给出的答案。 我想知道这个查找是如何实现的。