自由な時間があったので、アプリケーションに実装するカスタム ログ システムのいくつかのオプションをベンチマークすることにしました。ポイントは、さまざまなクラスや関数からの実行中のイベントを、後で調べることができる配列に単純に記録することです。
これらを試しているうちに、私は困惑したことがわかりました.別のクラスの変数を変更するために特性を使用すると、「自己」の変数を変更するよりも時間がかかります. また、変数を直接変更するよりも時間がかかります。
私はわずかなパフォーマンスの向上にはまったく興味がなく、最終的な実装についてもまだ決定していません。なぜこれが起こるのか、私はただ興味があります。
これをテストするコードは次のとおりです。他のテストもいくつか行いましたが、明らかな理由で遅くなりました。
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...