вторник, 16 октября 2012 г.

isset vs array_key_exists

Я почему то всё время считал, что функции isset и array_key_exists должны работать с одинаковой скоростью. Ну просто исходя из принципа работы хеш-массивов.

Однако же нет.

В статье пишут, что array_key_exists для того, чтобы найти ключ, пробегается по всему списку ключей. Но всё куда интереснее.

Написал простейший тестик: http://pastebin.com/kQyPHFnP

----------------------
@cycles: 1000000
@length: 1000
@tries: 5
preparing array with 1000 elements ... OK
array_key_exists: 0.9951 second(s)
isset: 0.2721 second(s)
----------------------
@cycles: 1000000
@length: 10000
@tries: 5
preparing array with 10000 elements ... OK
array_key_exists: 0.9989 second(s)
isset: 0.2716 second(s)
----------------------
@cycles: 1000000
@length: 100000
@tries: 5
preparing array with 100000 elements ... OK
array_key_exists: 0.9891 second(s)
isset: 0.2716 second(s)
----------------------
@cycles: 1000000
@length: 1000000
@tries: 5
preparing array with 1000000 elements ... OK
array_key_exists: 1.0031 second(s)
isset: 0.2716 second(s)
----------------------

Результаты интересны тем, что
  1. array_key_exists работает приблизительно в 3.7 раза медленнее isset
  2. количество элементов в массиве на время работы этих функций не влияет.