Apcu_fetch () поиск быстрее с префиксом или суффиксом?

Сценарий:
— Небольшое количество проектов PHP (например, веб-сайтов), использующих APCu. Каждый идентифицируется уникальным идентификатором / хэшем, который может быть, например, 20 символов в длину. Мы называем это $site_hash ниже.
— В каждом проекте хранится большое количество небольших значений, хранящихся в APCu, идентифицируемых по ключам.

Обычно можно различить записи, используя ключи кеша, как это:

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

Но можно сделать это вместо этого:

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

Кто-то может подумать, что второй быстрее, потому что, как это, при поиске в хэш-таблице часто нужно только взглянуть на первые несколько символов.

Может ли кто-нибудь подтвердить эту гипотезу?

(Я уверен, что смогу провести этот эксперимент самостоятельно. Если я это сделаю, я поделюсь им здесь.)

2

Решение

Даже если функция использует хеш-таблицу, оба ваших метода могут быть быстрее, чем другой. Я объясняю:

Если $ site_hash используется до $ key, тогда скорость зависит от значения ASCII первых символов (если строка начинается с «z», она будет медленнее, чем если бы она начиналась с «a»).

И проблема будет такой же, если она начинается с $ key.

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
)

Наблюдение:
Для нескольких прогонов, казалось, было очень маленькое, но последовательное преимущество для версии с суффиксом.
Однако последующие прогоны не подтвердили это.
Для этого эксперимента нет статистически значимой измеримой разницы между ними.

Заключение:
Основываясь на этом эксперименте, не имеет значения, использовать ли префикс или суффикс.
Это может быть не окончательный ответ, но это ответ, который я могу дать в данный момент.
Интересно, как этот поиск реализован.

0

По вопросам рекламы [email protected]