...И тормознул крутейший массив
В языке PHP одним из самых широко используемых типов данных является массив. Массив в PHP ассоциативный, позволяет сопоставлять строковому или целочисленному ключу произвольное значение. Пример:
Я сгенерировал два ассоциативных массива таким образом (часть кода, разная для этих двух массивов, пропущена):
Как видите, массивы ничем не отличаются, все ключи в них — строковые, с длиной строки 6 символов. Однако тысячекратная сумма элементов первого массива вычисляется 1.148 секунд, а второго 26.928 секунд.
Почему так? Самые догадливые могут догадаться, как именно такой результат получить, а телепаты даже объяснить, почему разница именно в 20 раз, а не, скажем, в 500 или в два раза.
UPD: сделал немного понятнее условие.
$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);
$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: сделал немного понятнее условие.