Скорость поиска в массиве в PHP;длинные ключи кеша - PullRequest
2 голосов
/ 09 июля 2011

Я работаю над методом, который из-за стоимости его работы и частоты, который вызывается с идентичными аргументами, выиграл бы от кэширования возвращаемых значений.

Я буду serialize() связывать аргументы для ключей кэша, но это может привести к очень длинным ключам из-за длинных аргументов массива.

  • Страдают ли индексация и поиск в массивах PHP от таких длинных ключей ( от 250 Б до 1 КБ + )?
  • Пока все хорошо, но сталкиваюсь ли я с ситуацией, когда в какой-то момент это может сорваться со мной?
  • В общем, я должен md5() ( или альтернативный ) ключи?

Небольшие уточнения :
Это кэширование только по запросу без постоянного хранения. Рассматриваемый метод является методом помощника вида, и для каждого поколения представления он может вызываться 500 или более раз.

Ответы [ 2 ]

4 голосов
/ 09 июля 2011

Вы должны обязательно хешировать ключ.Вы, возможно, скажете: «Почему я должен рисковать получать коллизии, когда я могу в любой момент объединить уникальный ключ?».Простой ответ: если вы генерируете ключи кеша с помощью конкатенации строк, вам всегда нужно вычислять с наихудшим случаем требований к пространству для оценки использования оперативной памяти.

Так что если у вас есть кеш с 200 записями .. и 2 полями20 символов максимальных струн.Худший случай будет 200*2*20*(size of character).Если вы загружаете полный кэш на каждом возможном параллельном соединении, это умножится на количество параллельных соединений.

С хэшами у вас всегда есть минимальное требование к оперативной памяти = максимальное требование к оперативной памяти для поля ключа.

Если у вас есть много значений, которые объединяются для ключей, это очень плохо масштабируется.

Редактировать:

Даже если вы используете его для запроса, массив потребляет память.Хотя это кеш, он присутствует от начала до конца запроса.Поэтому вам необходимо учитывать, что он занимает определенное количество места в вашей памяти, а при использовании хеша - фиксированное количество.

Во-вторых, необходимо сравнивать ключи.Если вы обращаетесь к ассоциативному массиву с помощью строкового ключа, ваш интерпретатор должен сравнить ключ с помощью charwise.Если у вас есть метод хеширования для генерации ключей, это также будет фиксированное количество шагов.

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

1 голос
/ 09 июля 2011

Это, конечно, не типично иметь такие длинные ключи массива, но вам, вероятно, придется сделать бенчмаркинг, чтобы угадать, какое замедление на самом деле это дает.Если вы сомневаетесь, просто md5 - из того, что вы говорите, ускорение все равно будет настолько большим по сравнению со временем md5, что последнее будет тривиальным.

...