Самый быстрый способ обработки неопределенного ключа массива ⇐ Php
-
Anonymous
Самый быстрый способ обработки неопределенного ключа массива
В очень узком цикле мне нужно получить доступ к десяткам тысяч значений в массиве, содержащем миллионы элементов. Ключ может быть неопределенным: в этом случае разрешено возвращать NULL без сообщения об ошибке:
[*]Ключ массива существует: возвращаемое значение элемента. [*]Ключ массива не существует: верните ноль.
Я знаю несколько решений:
if (isset($lookup_table[$key])) { вернуть $lookup_table[$key]; } еще { возвращаться; } или
@return $lookup_table[$key]; или
error_reporting(0); $return = $lookup_table[$key]; error_reporting(E_ALL); вернуть $возврат; Все решения далеки от оптимальных:
[*]Первый требует двух поисков в B-TREE: один для проверки существования, другой для получения значения. Это фактически удваивает время выполнения. [*]Второй использует оператор подавления ошибок и, таким образом, создает огромные накладные расходы в этой строке. [*]Третий вызывает обработчик ошибок (который проверит настройку error_reporting, а затем ничего не отобразит) и тем самым создает накладные расходы.
Может быть, я упустил способ избежать обработки ошибок и при этом работать с одним поиском Btree?
Чтобы ответить на некоторые вопросы:
Массив кэширует результаты сложных вычислений, которые необходимо выполнить в режиме реального времени. Из миллиардов возможных значений только миллионы дают действительный результат. Массив имеет вид 1234567 => 23457, 1234999 => 74361, .... Он сохраняется в PHP-файл размером в несколько мегабайт и включается include_once-d в начале выполнения. Время начальной загрузки не имеет значения.
Если ключ не найден, это просто означает, что это конкретное значение не вернет действительный результат. Проблема в том, чтобы сделать это со скоростью более 50 тысяч в секунду.
В очень узком цикле мне нужно получить доступ к десяткам тысяч значений в массиве, содержащем миллионы элементов. Ключ может быть неопределенным: в этом случае разрешено возвращать NULL без сообщения об ошибке:
[*]Ключ массива существует: возвращаемое значение элемента. [*]Ключ массива не существует: верните ноль.
Я знаю несколько решений:
if (isset($lookup_table[$key])) { вернуть $lookup_table[$key]; } еще { возвращаться; } или
@return $lookup_table[$key]; или
error_reporting(0); $return = $lookup_table[$key]; error_reporting(E_ALL); вернуть $возврат; Все решения далеки от оптимальных:
[*]Первый требует двух поисков в B-TREE: один для проверки существования, другой для получения значения. Это фактически удваивает время выполнения. [*]Второй использует оператор подавления ошибок и, таким образом, создает огромные накладные расходы в этой строке. [*]Третий вызывает обработчик ошибок (который проверит настройку error_reporting, а затем ничего не отобразит) и тем самым создает накладные расходы.
Может быть, я упустил способ избежать обработки ошибок и при этом работать с одним поиском Btree?
Чтобы ответить на некоторые вопросы:
Массив кэширует результаты сложных вычислений, которые необходимо выполнить в режиме реального времени. Из миллиардов возможных значений только миллионы дают действительный результат. Массив имеет вид 1234567 => 23457, 1234999 => 74361, .... Он сохраняется в PHP-файл размером в несколько мегабайт и включается include_once-d в начале выполнения. Время начальной загрузки не имеет значения.
Если ключ не найден, это просто означает, что это конкретное значение не вернет действительный результат. Проблема в том, чтобы сделать это со скоростью более 50 тысяч в секунду.
Мобильная версия