我有一些空闲时间,并决定对我将在我的应用程序中实现的自定义日志记录系统的几个选项进行基准测试。关键是在执行期间将来自不同类和函数的事件简单地记录到一个数组中,以便以后检查。
在尝试这些时,我看到了一些让我感到困惑的事情:使用 trait 修改另一个类中的变量比修改“self”中的变量需要更长的时间。它也比直接修改变量需要更长的时间。
我对微不足道的性能提升并不完全感兴趣,也还没有决定最终的实现。我只是好奇为什么会这样。
这是测试它的代码。我还进行了一些其他测试,但由于明显的原因它们速度较慢。
class ExternalStore {
public static $log = [];
}
trait LoggerTrait {
public static function addLog($time, $event) {
return [$time, $event];
}
}
echo "<h1>Changing external variable directly</h1>";
class ExternalAppend {
public function doStuff() {
for ($i = 0; $i < 100000; $i++) {
ExternalStore::$log += [microtime(), "Stuff done"];
}
}
}
$ExternalAppend = new ExternalAppend;
$start = microtime(true);
$ExternalAppend->doStuff();
$time = microtime(true) - $start;
echo "Execution time: $time<hr>"; // ~0.18...
echo "<h1>Using a trait to change internal variable</h1>";
class TraitUser {
use LoggerTrait;
public static $log = [];
public function doStuff() {
for ($i = 0; $i < 100000; $i++) {
self::$log += self::addLog(microtime(), "Stuff done");
}
}
}
$TraitUser = new TraitUser();
$start = microtime(true);
$ExternalAppend->doStuff();
$time = microtime(true) - $start;
echo "Execution time: $time<hr>"; // ~0.18...
echo "<h1>Using a trait to change external variable</h1>";
class TraitUserExternal {
use LoggerTrait;
public function doStuff() {
for ($i = 0; $i < 100000; $i++) {
ExternalStore::$log += self::addLog(microtime(), "Stuff done");
}
}
}
$TraitUserExternal = new TraitUserExternal();
$start = microtime(true);
$TraitUserExternal->doStuff();
$time = microtime(true) - $start;
echo "Execution time: $time<hr>"; // ~0.30...