Скорость работы array_intersect — реальная скорость и есть ли альтернативы?

Не могу толком померить скорость работы array_intersect, интересует чистое время выполнения функции при пересечении пары массивов целых на 7000 элементов каждый.

Код:
define("ARRAY_SIZE", 7000);
define("PASSES", 100);

function randomArray($size = 1000, $min = 1, $max = 65535 ) {
    $res = [];
    for($i = 0; $i< $size; $i++) {
        $res[] = mt_rand($min, $max);
    }

    return $res;
}

    $a = randomArray(ARRAY_SIZE);
    $b = randomArray(ARRAY_SIZE);

	for($i = 0; $i < PASSES; $i++) {
		$x = array_intersect($a, $b);
	}

    echo "C=", count($x), " \n";


Запуск XDebug в режиме профайлера говорит, что порядка 5 единиц (то есть по хелпу это 5 микросекунд), однако скрипт выполняется примерно 5с (с выключенным профайлером, PHP 5.6.7). Сколько же реально-то?

Есть ли какой-то вариант сделать это пересечение быстрее? Нужен очень быстрый способ сделать примерно сотню таких пересечений.
  • Вопрос задан
  • 483 просмотра
Решения вопроса 1
@JSmitty Автор вопроса
Спасибо PQR за наводку на прекрасную презентацию, собственно удалось разогнать операцию на два порядка (в 100 раз). Надо использовать только ключи в массиве и пересекать их (array_intersect_key), а не значения. Пересечение делается через хэш, а не перебором значений (как в array_intersect).

Изменения такие:
$res[] = mt_rand($min, $max) - меняем на - $res[mt_rand($min, $max)] = true;
И меняем array_intersect на array_intersect_key.

PS Самое интересное, что где-то на Stackoverflow я видел такой совет, но не понял, как им воспользоваться. Пример в презентации по ссылке выше решил вопрос.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
PQR
@PQR
Есть отличная презентация по структурам данных в PHP, в частности там и про intersect был слайд: www.slideshare.net/mobile/patrick.allaert/php-data...
Ответ написан
65536
@65536
ну а если померить не дебагом а старым дедовским методом microtime(1) - $start

вряд ли в пхп можно такое быстро посчитать, разве математическим путем каким-то
может есть смысл кешировать эти результаты? смотря что там у вас
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы