Image

Listens: Ayreon — [Universal Migrator] Temple Of The Cat

Category:

...И тормознул крутейший массив

В языке PHP одним из самых широко используемых типов данных является массив. Массив в PHP ассоциативный, позволяет сопоставлять строковому или целочисленному ключу произвольное значение. Пример:

$arr = array('abcdef' => 1, 'bcdefg' => 3.14, 'cdefgh' => true);


Я сгенерировал два ассоциативных массива таким образом (часть кода, разная для этих двух массивов, пропущена):

$nkeys = 1000;
$nqueries = 1000000;

// Пропущено: генерация массива $keys, разного для двух массивов

$arr = array();
for ($i = 0; $i < $nkeys; ++$i) {
    $arr[$keys[$i]] = $i;
}

$time1 = microtime(true);
$sum = 0;
for ($i = 0; $i < $nqueries; ++$i) {
    $sum += $arr[$keys[$i % $nkeys]];
}
$time2 = microtime(true);


Как видите, массивы ничем не отличаются, все ключи в них — строковые, с длиной строки 6 символов. Однако тысячекратная сумма элементов первого массива вычисляется 1.148 секунд, а второго 26.928 секунд.

Почему так? Самые догадливые могут догадаться, как именно такой результат получить, а телепаты даже объяснить, почему разница именно в 20 раз, а не, скажем, в 500 или в два раза.

UPD: сделал немного понятнее условие.