в очень узком цикле мне нужно получить доступ к десятым числам значений в массиве, содержащем миллионы элементов. Ключ может быть не определен: в этом случае законно возвращать NULL без сообщения об ошибке:
Существует массив Array: возвращает значение элемента. Клавиша Array не существует: return null.
Я знаю несколько решений:
if (isset($lookup_table[$key])) {
return $lookup_table[$key];
} else {
return;
}
или
@return $lookup_table[$key];
или
error_reporting(0);
$return = $lookup_table[$key];
error_reporting(E_ALL);
return $return;
Все решения далеко не оптимальны:
- Первый требует 2 поиска в B-TREE: один для проверки существования, другой для получения значения. Это эффективно удваивает время выполнения.
- Второй использует оператор подавления ошибок и, таким образом, создает большие накладные расходы на этой линии.
- Третий вызывает обработчик ошибок (который будет проверять параметр error_reporting, а затем отображать ничего) и тем самым создает накладные расходы.
Мой вопрос, если я пропустил способ избежать обработки ошибок и все же работать с одним поиском btree?
Чтобы ответить на некоторые вопросы:
Массив кэширует результаты комплексного вычисления - комплексно выполняется в реальном времени. Из миллиардов возможных значений только миллионы были действительными. Массив выглядит как 1234567 = > 23457, 1234999 = > 74361,.... Это сохраняется в php файле в несколько мегабайт, а include_once-d - в начале выполнения. Начальное время загрузки не имеет значения. Если ключ не найден, это просто означает, что этот конкретный результат не вернет действительный результат. Проблема состоит в том, чтобы сделать это 50k + в секунду.
Заключение
Поскольку нет способа найти значение с одним поиском и без обработки ошибок, я не могу принять один ответ. Вместо этого я выделил все большие вклады.
Самые ценные входы, где: - используйте array_key_exists, поскольку это быстрее, чем альтернативы - Проверьте php QuickHash
Было много путаницы в том, как PHP обрабатывает массивы. Если вы проверите исходный код, вы увидите, что все массивы являются сбалансированными деревьями. Создание собственных методов поиска распространено в C и С++, но не работает в более высоких script -языках, таких как php.