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

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)