Ich möchte nur einen Beitrag zu diesem Gespräch leisten:
-
Was passiert, wenn die Messung auf zwei Punkte A und B in verschiedenen php-Dateien abzielt?
-
Was ist, wenn wir verschiedene Messungen benötigen, wie z. B. die Dauer der Codeausführung, die Dauer des Zugriffs auf externe Ressourcen?
-
Was ist, wenn wir unsere Messungen in Kategorien einteilen müssen, von denen jede einen anderen Ausgangspunkt hat?
Wie Sie vermuten, benötigen wir einige globale Variablen, auf die von einem Klassenobjekt oder einer statischen Methode zugegriffen werden kann: Ich habe mich für den 2. Ansatz entschieden und hier ist er:
namespace g3;
class Utils {
public function __construct() {}
public static $UtilsDtStart = [];
public static $UtilsDtStats = [];
public static function dt() {
global $UtilsDtStart, $UtilsDtStats;
$obj = new \stdClass();
$obj->start = function(int $ndx = 0) use (&$UtilsDtStart) {
$UtilsDtStart[$ndx] = \microtime(true) * 1000;
};
$obj->codeStart = function(int $ndx = 0) use (&$UtilsDtStart) {
$use = \getrusage();
$UtilsDtStart[$ndx] = ($use["ru_utime.tv_sec"] * 1000) + ($use["ru_utime.tv_usec"] / 1000);
};
$obj->resourceStart = function(int $ndx = 0) use (&$UtilsDtStart) {
$use = \getrusage();
$UtilsDtStart[$ndx] = $use["ru_stime.tv_usec"] / 1000;
};
$obj->end = function(int $ndx = 0) use (&$UtilsDtStart, &$UtilsDtStats) {
$t = @$UtilsDtStart[$ndx];
if($t === null)
return false;
$end = \microtime(true) * 1000;
$dt = $end - $t;
$UtilsDtStats[$ndx][] = $dt;
return $dt;
};
$obj->codeEnd = function(int $ndx = 0) use (&$UtilsDtStart, &$UtilsDtStats) {
$t = @$UtilsDtStart[$ndx];
if($t === null)
return false;
$use = \getrusage();
$dt = ($use["ru_utime.tv_sec"] * 1000) + ($use["ru_utime.tv_usec"] / 1000) - $t;
$UtilsDtStats[$ndx][] = $dt;
return $dt;
};
$obj->resourceEnd = function(int $ndx = 0) use (&$UtilsDtStart, &$UtilsDtStats) {
$t = @$UtilsDtStart[$ndx];
if($t === null)
return false;
$use = \getrusage();
$dt = ($use["ru_stime.tv_usec"] / 1000) - $t;
$UtilsDtStats[$ndx][] = $dt;
return $dt;
};
$obj->stats = function(int $ndx = 0) use (&$UtilsDtStats) {
$s = @$UtilsDtStats[$ndx];
if($s !== null)
$s = \array_slice($s, 0);
else
$s = false;
return $s;
};
$obj->statsLength = function() use (&$UtilsDtStats) {
return \count($UtilsDtStats);
};
return $obj;
}
}
Jetzt müssen Sie nur noch die Methode aufrufen, die zu der spezifischen Kategorie mit dem Index gehört, der ihre eindeutige Gruppe bezeichnet:
File A
------
\call_user_func_array(\g3\Utils::dt()->start, [0]); // point A
...
File B
------
$dt = \call_user_func_array(\g3\Utils::dt()->end, [0]); // point B
Wert $dt
enthält die Millisekunden der Wanduhrdauer zwischen den Punkten A und B.
Schätzung der Zeit, die für die Ausführung von PHP-Code benötigt wird:
File A
------
\call_user_func_array(\g3\Utils::dt()->codeStart, [1]); // point A
...
File B
------
$dt = \call_user_func_array(\g3\Utils::dt()->codeEnd, [1]); // point B
Beachten Sie, dass wir den Index geändert haben, den wir an die Methoden übergeben.
Der Code basiert auf dem Closure-Effekt, der auftritt, wenn wir ein Objekt/eine Funktion aus einer Funktion zurückgeben (siehe das \g3\Utils::dt()
bei den Beispielen wiederholt).
Ich testete mit php unit und zwischen verschiedenen Testmethoden an der gleichen Testdatei verhält es sich gut so weit!
Hoffentlich hilft das jemandem!