Сравнение больших массивов

Иногда может возникнуть необходимость сравнения больших (свыше 10 — 100 тысяч значений) массивов чисел или строк функциями array_intersect() или array_diff(). Непосредственное использование этих функций с исходными массивами работает непозволительно долго (единицы — десятки секунд).

В этом случае простым и эффективным решением является инвертирование массивов функцией array_flip() и последующее сравнение функциями array_intersect_key() или array_diff_key(). Принцип работы метода прост — поиск по ключам массива производится на порядок быстрее, чем по значениям.

Уже при использовании такого упрощённого метода производительность возрастает в десятки раз (из личной практики — ускорение в 30-40 раз, достаточное, чтобы выполнить сравнение меньше, чем за секунду). Время работы функции array_flip() при этом учитывается. Ещё большего ускорения (50-70 раз) можно добиться, инвертировав только один массив, и пройдя по другому в цикле, используя для поиска конструкцию isset(). Какой именно массив инвертировать — зависит от конкретной задачи и ожидаемого числа совпадений или несовпадений. Однако, если один из массивов заведомо небольшого размера, лучше инвертировать другой (больший) массив, чтобы не проходить по нему в цикле.

В любом случае, итоговое решение, как и любое другое оптимизационное решение, нужно тестировать на производительность и искать оптимальный алгоритм.

Записи