繁体   English   中英

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

[英]Is apcu_fetch() lookup faster with prefix or suffix?

场景:-少数使用APCu的PHP项目(例如网站)。 每一个都由唯一的ID /哈希标识,例如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
)

观察:对于几次运行,带有后缀的版本似乎具有很小但始终如一的优势。 但是,随后的运行没有证实这一点。 对于此实验,两者之间在统计学上没有可测量的显着差异。

结论:根据该实验,使用前缀还是后缀都没有关系。 这可能不是最终的答案,但这是我目前可以提供的答案。 我想知道如何实现此查找。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM