Тест Майкла Кармана хорош, но его результаты уже устарели, поэтому люди, не запускающие его на своей машине, могут получить неправильное представление. Итак, точно такой же тест (всего в 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 или более вы должны сделать Это.
person
Ecuador
schedule
24.05.2017