【发布时间】:2017-02-03 17:50:51
【问题描述】:
场景:
- 少量使用 APCu 的 PHP 项目(例如网站)。每个都由唯一的 id / hash 标识,例如20 个字符长。我们在下面称之为$site_hash。
- 每个项目都存储了大量的小值,存储在 APCu 中,由键标识。
通常人们会使用这样的缓存键来区分条目:
$value = apcu_fetch($site_hash . '|' . $key);
但可以改为这样做:
$value = apcu_fetch($key . '|' . $site_hash);
人们可能会认为第二个更快,因为像这样,哈希表查找通常只需要查看前几个字符。
有人可以证实这个假设吗?
(我相信我可以自己进行这个实验。如果可以,我会在这里分享。)
【问题讨论】:
-
好吧,你没看错。另一方面,您在这里实际上是在谈论毫秒。除非您正在做的事情真正精确、诚实,无论哪种方式都可以。
-
每个请求可能会被调用 300 次。类加载器的缓存。所以如果我能节省 2 毫秒,我会的。
-
很公平。 @LeCintas 确实提出了一个很好的观点,无论您如何放置这些键或它们具有什么值,平均查找时间仍然是 O(n)。
-
为什么是 O(n)?假设 n = 项目数,如果它必须遍历所有元素直到找到匹配项,这将是 O(n)。如果元素存储在查找树中,则为 ~O(log n),这就是此类哈希表的实现方式。但是字符串的长度也有影响。假设 m 是字符串的长度。那么它可能是 O(m + log n) 或 O(m * log n),这取决于它是如何实现的。也许 m 被替换为 k,其中 k
-
所以唯一完整的答案就是基准测试。