今天,我找到了对它进行基准测试的时间。
就像我预期的那样(Fleshgrinder 说):splat 运算符更快。
基准时间:
反射:11.686084032059s
Splat:6.8125338554382s
差不多一半的时间……那是认真的……
基准测试(通过http://codepad.org/jqOQkaZR):
<?php
require "autoload.php";
function convertStdToCollectionReflection(array $stds, $entity, $initVars)
{
$records = array();
$class = $entity . '\\Entity';
foreach ($stds as $record) {
$args = array();
foreach ($initVars as $var) {
$args[] = $record->$var;
}
$reflect = new \ReflectionClass($class);
$records[] = $reflect->newInstanceArgs($args);
}
return $records;
}
function convertStdToCollectionSplat(array $stds, $entity, $initVars)
{
$records = array();
$class = $entity . '\\Entity';
foreach ($stds as $record) {
$args = array();
foreach ($initVars as $var) {
$args[] = $record->$var;
}
$records[] = new $class(...$args);
}
return $records;
}
$dummyObject = array();
for ($i = 0; $i < 10; $i++) {
$dummyclass = new \stdClass();
$dummyclass->id = $i;
$dummyclass->description = 'Just a number... ' . $i;
$dummyObject[] = $dummyclass;
}
print 'Start Reflection test' . PHP_EOL;
$reflectionStart = microtime(true);
for($i = 0; $i < 1000000; $i++) {
convertStdToCollectionReflection(
$dummyObject,
'Xcs\Core\Record',
array(
'id',
'description'
)
);
}
$reflectionEnd = microtime(true);
print 'Start Splat test' . PHP_EOL;
$splatStart = microtime(true);
for($i = 0; $i < 1000000; $i++) {
convertStdToCollectionSplat(
$dummyObject,
'Xcs\Core\Record',
array(
'id',
'description'
)
);
}
$splatEnd = microtime(true);
print PHP_EOL . 'OUTPUT:' . PHP_EOL;
print 'Reflection: ' . ($reflectionEnd - $reflectionStart) . 's' . PHP_EOL;
print 'Splat: ' . ($splatEnd - $splatStart) . 's' . PHP_EOL;