Perl Multi Hash против Single Hash - PullRequest
3 голосов
/ 20 июня 2011

Я хочу прочитать и обработать наборы ввода из файла, а затем распечатать его. Есть 3 ключа, которые мне нужно использовать для хранения данных. Предположим, что 3 ключа k1, k2, k3

Что из следующего даст лучшую производительность

$hash{k1}->{k2}->{k3} = $val;

или

$hash{"k1,k2,k3"} = $val;

На мой предыдущий вопрос я получил ответ, что все хеш-ключи perl обрабатываются как строки.

Ответы [ 3 ]

5 голосов
/ 20 июня 2011

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

Если это не так, это может зависеть от диапазона возможных ключей.Если упорядочение не является проблемой, упорядочите данные так, чтобы k1 был наименьшим набором ключей, а k3 - самым большим.Я подозреваю, что таким образом вы будете использовать меньше памяти для хэшей.В зависимости от ваших наборов данных может быть даже целесообразно прецизировать ваши хэши (я думаю, что %hash = 100 добивается цели).

Что быстрее, скажет только профилирование.Попробуйте оба варианта и убедитесь сами.

Также обратите внимание, что $hash{k1}->{k2}-{k3} не требуется.Вы можете написать $hash{k1}{k2}{k3}.Разыменования не являются необходимыми в скобках , квадратные или вьющиеся.

4 голосов
/ 20 июня 2011

Скорость поиска хеша не зависит от количества элементов в хэше, поэтому версия, которая выполняет только один поиск хеша, выполнит часть операции поиска хеша быстрее, чем версия, которая выполняет три поиска хеша.Но, с другой стороны, версия с одним поиском должна объединить три ключа в одну строку, прежде чем их можно будет использовать в качестве комбинированного ключа;если эта строка является анонимной (например, $hash{"$a,$b,$c"}), это, вероятно, потребует некоторых забавных вещей, таких как выделение памяти.В целом, я ожидал бы, что конкатенация будет достаточно быстрой, чтобы версия с одним поиском в большинстве случаев была быстрее, чем версия с тремя поисками, но единственный способ узнать, что быстрее в вашем случае, будетписать один и тот же код в обоих стилях и Benchmark разница.

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

$ time perl -e '$foo{bar} for 1 .. 1_000_000'
real    0m0.089s
user    0m0.088s
sys 0m0.000s

В этом тривиальном (и, по общему признанию, крайне ошибочном) примере я получил скорость, эквивалентную примерно 11 миллионам поисков хеша в секунду.За то время, которое вы потратили, задавая вопрос, ваш компьютер мог бы выполнить сотни миллионов, если не миллиардов , операций поиска в хешах.

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

2 голосов
/ 20 июня 2011

Если у вас есть проблемы с памятью, я бы предложил использовать Devel::Size из CPAN на ранней стадии разработки, чтобы получить размер обеих альтернатив. В противном случае используйте тот, который кажется вам дружественным!

...