Сценарий:
— Небольшое количество проектов PHP (например, веб-сайтов), использующих APCu. Каждый идентифицируется уникальным идентификатором / хэшем, который может быть, например, 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
)
Наблюдение:
Для нескольких прогонов, казалось, было очень маленькое, но последовательное преимущество для версии с суффиксом.
Однако последующие прогоны не подтвердили это.
Для этого эксперимента нет статистически значимой измеримой разницы между ними.
Заключение:
Основываясь на этом эксперименте, не имеет значения, использовать ли префикс или суффикс.
Это может быть не окончательный ответ, но это ответ, который я могу дать в данный момент.
Интересно, как этот поиск реализован.