Wednesday, July 18, 2012

Decorator or Subclassing?

Using anonymous functions in PHP is very nice to implement a decorator, but what about performance? Results:
  • Subclassing is 40 percent faster than using a decorator
  • Subclassing might require a bit more code

Here is the code:
class App {
  public static function route($pattern, $callback, $args) {
    // evaluate $pattern ...
    call_user_func_array($callback, $args);
  }
}

class AppJson extends App {
  public static function route($pattern, $callback, $args) {
    // evaluate $pattern ...
    $str = json_encode(call_user_func_array($callback, $args));
  }
}


$start = microtime(true);
for ($i=0; $i<10000; $i++) {
  AppJson::route('/json/range', 'range', [0,10]);
}
echo ' '.(microtime(true)-$start); // 0.1058s


$json = function ($func) {
  return function() use (&$func) {
    $str = json_encode(call_user_func_array($func, func_get_args()));
  };
};

$start = microtime(true);
for ($i=0; $i<10000; $i++) {
  App::route('/json/range', $json('range'), [0,10]);
}
echo ' '.(microtime(true)-$start); // 0.1763s

No comments:

Post a Comment

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)