Тест Майкла Кармана хорош, но к настоящему моменту результаты уже устарели, поэтому люди, не использующие его на своей машине, могут ошибиться.
Итак, точно такой же тест (всего в 10 раз больше случаев, чтобы получить более последовательные результаты) на Mac Pro с Mac OS X и Perl 5.24.1:
Rate string_cmp hash_exists hash_value
string_cmp 54142/s -- -28% -32%
hash_exists 74850/s 38% -- -7%
hash_value 80192/s 48% 7% --
Однако на AWS с CentOS 7 / Perl 5.24.0 мы получаем:
string_cmp 70373/s -- -24% -25%
hash_value 92851/s 32% -- -1%
hash_exists 93545/s 33% 1% --
Итак, я бы сказал, протестируйте свою собственную машину, но, похоже, в настоящее время такая возможность не дает никаких преимуществ (на моем Mac с последним Perl она даже заметно медленнее в этом конкретном тесте - и даже в других тестах).
Одна вещь, которая мне не нравится в тесте, это то, что он довольно произвольно выбирает сравнение 4 равенств с проверкой хеша. Не смущайтесь, если у нас есть только один элемент в хэше, поэтому мы сравниваем с одним полученным равенством (на моем Mac Pro / Perl 5.24.1):
hash_value 119474/s -- -1% -14% -34%
hash_exists 121065/s 1% -- -12% -33%
grep 138122/s 16% 14% -- -23%
string_cmp 180180/s 51% 49% 30% --
Я добавил туда один grep, который избегает цикла foreach для сравнения. Итак, одно равенство, очевидно, быстрее, чем проверка хеша, но не в два раза быстрее, поэтому, если вы можете заменить только два равенства проверкой хеша, вы получите преимущество:
string_cmp 104167/s -- -15% -17%
hash_value 121951/s 17% -- -2%
hash_exists 125000/s 20% 2% --
Однако это с хешем, предварительно созданным вне цикла, как в оригинальном примере. Что если мы создадим хэш в каждом цикле тестирования? То есть у вас есть пара значений, которые вы хотите проверить на наличие в массиве, стоит ли создавать хеш с ними? Я не буду утомлять вас дополнительными результатами, поскольку вы можете обнаружить, что они различаются на вашей машине, но ответ таков: для 2 значений «это зависит» (так что, возможно, вам не стоит беспокоиться), но для 3 или более вы должны сделать это.