Thursday, July 12, 2012

Array key lookup: isset() or array_key_exists() or @ ?

Lessons learned:
  • isset() is faster than array_key_exists()
  • array_key_exists() is faster than @
  • @ is slower than ignoring notices with error_reporting()

Here is the code running on a 1.4 GHz machine with PHP 5.4.0:
error_reporting(E_ALL & ~E_NOTICE);

$a = array();
for ($i=0; $i<100000; $i++) $a[] = $i*2;

$start = microtime(true);
for ($i=0; $i<100000; $i++) if (isset($a[$i])) {}
echo ' '.(microtime(true)-$start); // 0.017

$start = microtime(true);
for ($i=0; $i<100000; $i++) if (array_key_exists($i, $a)) {}
echo ' '.(microtime(true)-$start); // 0.064

$start = microtime(true);
for ($i=0; $i<100000; $i++) if (@$a[$i]) {}
echo ' '.(microtime(true)-$start); // 0.095

$start = microtime(true);
for ($i=0; $i<100000; $i++) if ($a[$i]) {}
echo ' '.(microtime(true)-$start); // 0.016

$a = array();

$start = microtime(true);
for ($i=0; $i<100000; $i++) if (isset($a[$i])) {}
echo ' '.(microtime(true)-$start); // 0.016

$start = microtime(true);
for ($i=0; $i<100000; $i++) if (array_key_exists($i, $a)) {}
echo ' '.(microtime(true)-$start); // 0.058

$start = microtime(true);
for ($i=0; $i<100000; $i++) if (@$a[$i]) {}
echo ' '.(microtime(true)-$start); // 0.29

$start = microtime(true);
for ($i=0; $i<100000; $i++) if ($a[$i]) {}
echo ' '.(microtime(true)-$start); // 0.20

2 comments:

  1. ... and empty() is faster than both, in case it's suitable.

    ReplyDelete
  2. Thanks, empty() is a good point. If we skip values with 0, it is the fastest for empty arrays and second/third place if the array is filled (on my machine using 5.4.0).

    ReplyDelete

Labels

performance (23) benchmark (6) MySQL (5) architecture (5) coding style (5) memory usage (5) HHVM (4) C++ (3) Java (3) Javascript (3) MVC (3) SQL (3) abstraction layer (3) framework (3) maintenance (3) Go (2) Golang (2) HTML5 (2) ORM (2) PDF (2) Slim (2) Symfony (2) Zend Framework (2) Zephir (2) firewall (2) log files (2) loops (2) quality (2) real-time (2) scrum (2) streaming (2) AOP (1) Apache (1) Arrays (1) C (1) DDoS (1) Deployment (1) DoS (1) Dropbox (1) HTML to PDF (1) HipHop (1) OCR (1) OOP (1) Objects (1) PDO (1) PHP extension (1) PhantomJS (1) SPL (1) SQLite (1) Server-Sent Events (1) Silex (1) Smarty (1) SplFixedArray (1) Unicode (1) V8 (1) analytics (1) annotations (1) apc (1) archiving (1) autoloading (1) awk (1) caching (1) code quality (1) column store (1) common mistakes (1) configuration (1) controller (1) decisions (1) design patterns (1) disk space (1) dynamic routing (1) file cache (1) garbage collector (1) good developer (1) html2pdf (1) internationalization (1) invoice (1) just-in-time compiler (1) kiss (1) knockd (1) legacy code (1) legacy systems (1) logtop (1) memcache (1) memcached (1) micro framework (1) ncat (1) node.js (1) openssh (1) pfff (1) php7 (1) phpng (1) procedure models (1) ramdisk (1) recursion (1) refactoring (1) references (1) regular expressions (1) search (1) security (1) sgrep (1) shm (1) sorting (1) spatch (1) ssh (1) strange behavior (1) swig (1) template engine (1) threads (1) translation (1) ubuntu (1) ufw (1) web server (1) whois (1)