Created
August 15, 2012 12:40
-
-
Save mindplay-dk/3359812 to your computer and use it in GitHub Desktop.
A benchmark of reflection API performance in PHP
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Benchmark: Reflection Performance | |
* | |
* Conclusion: there is no performance-gain from caching reflection-objects. | |
*/ | |
define('NUM_TESTS', 10); | |
header('Content-type: text/plain'); | |
$func = function($a, $b, $c) { | |
// ... | |
}; | |
class Foo | |
{ | |
public $a; | |
protected $b; | |
private $c; | |
public function foo($a,$b,$c) {} | |
protected function bar($a,$b,$c) {} | |
private function baz($a,$b,$c) {} | |
} | |
for ($i=0; $i<NUM_TESTS; $i++) { | |
$start = microtime(true); | |
$ref = new ReflectionClass($func); | |
$end = microtime(true); | |
echo "ReflectionClass # $i: " . number_format(1000000*($end-$start), 3) . " µsec\n"; | |
} | |
for ($i=0; $i<NUM_TESTS; $i++) { | |
$start = microtime(true); | |
$ref = new ReflectionFunction($func); | |
$end = microtime(true); | |
echo "ReflectionFunction # $i: " . number_format(1000000*($end-$start), 3) . " µsec\n"; | |
} | |
class Cache | |
{ | |
private $cache = array(); | |
public function getReflection($class) | |
{ | |
if (!isset($this->cache[$class])) { | |
$this->cache[$class] = new ReflectionClass($class); | |
} | |
return $this->cache[$class]; | |
} | |
} | |
$cache = new Cache; | |
for ($i=0; $i<NUM_TESTS; $i++) { | |
$start = microtime(true); | |
$ref = $cache->getReflection('Foo'); | |
$end = microtime(true); | |
echo "Cached ReflectionClass # $i: " . number_format(1000000*($end-$start), 3) . " µsec\n"; | |
} |
I added this benchmark to the sandbox.
We can compare it on different versions of php.
the greater lesson here is "trust the language"
if you don't have a performance problem, don't optimize - especially not preemptively! there's a good chance the language will optimize later, and your "optimizations" become useless complexity, perhaps even slowing things down.
I've seen this happen with lots of things over the years - in different languages, in the browser, it's almost always safer and better in the long run to assume the language is good at what the language is supposed to do. 😄
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It's obviously never zero - that's your computers being so fast now that
microtime
doesn't have enough resolution to measure the actual time taken.Here's a (Linux only) version of the script using
hrtime
instead ofmicrotime
:Current results on my system with PHP 8.2.19:
Note that the results vary a lot - this simple script is 10+ years old and not a good benchmark, but run it a few times and you'll still get the jist, that you should not be caching reflection classes. They are cached internally in PHP, better than anything you can do in userland. 🙂