Heim > Backend-Entwicklung > PHP-Tutorial > Ausführliche Erklärung der hochpräzisen Timer-HRTime-Erweiterung in PHP

Ausführliche Erklärung der hochpräzisen Timer-HRTime-Erweiterung in PHP

藏色散人
Freigeben: 2023-04-10 10:52:01
nach vorne
3668 Leute haben es durchsucht

Ich frage mich, ob Sie sich noch an die Stoppuhr erinnern, die der Lehrer während des Sporttests in der Schule mitgebracht hat? Als der Schuss ertönte, begannen wir zu laufen und die Stoppuhr startete. Als wir die Ziellinie passierten, drückte der Lehrer den Knopf, um unsere Ergebnisse aufzuzeichnen. Was wir heute lernen werden, ist tatsächlich eine funktionale Erweiterung, die der Stoppuhr dieses Sporttests ähnelt. Es handelt sich um die HRTime-Erweiterung von PHP.

Uhrzeit

Zunächst müssen wir verstehen, wie die Uhr des Systems schlägt. Wenn das Linux-System gestartet wird, wird gleichzeitig ein Uhrenmetronom gestartet, um das Timing in Nanosekunden zu messen. Der eigentliche Name unserer HRTime-Erweiterung ist die hochpräzise Zeiterweiterung. Mit anderen Worten handelt es sich um ein auf dem Betriebssystem basierendes Taktmetronom, das das Timing in Nanosekunden messen kann.

1 Sekunde = 1000 Millisekunden = 1000000 Mikrosekunden = 1000000000 Nanosekunden Dies ist das Verhältnis zwischen Sekunden, Millisekunden, Mikrosekunden und Nanosekunden. Sie können sehen, wie genau es ist. 1 Sekunde entspricht 1 Milliarde Nanosekunden, sodass wir Zeitintervalle sehr genau zählen können.

Die HRTime-Erweiterung kann direkt von PECL heruntergeladen und installiert werden. Sie unterscheidet sich nicht von anderen gewöhnlichen Erweiterungen.

Informationen zum Tick der Systemuhr abrufen Ticks

Werfen wir zunächst einen Blick darauf, wie man den Takt des Betriebssystems erhält, nämlich diese Ticks. Was den Inhalt betrifft, glaube ich, dass viele Studenten beim Erlernen von Betriebssystemen bereits damit in Berührung gekommen sind. Hier sehen wir uns an, wie man es mithilfe der HRTime-Erweiterung erhält.

print_r(hrtime());
// Array
// (
//     [0] => 3758
//     [1] => 407409171
// )

echo hrtime(true), PHP_EOL;
// 3758407428932
Nach dem Login kopieren

hrtime() Diese Funktion wurde nach PHP7 in die Standard-PHP-Umgebung integriert. Die Verwendung der HRTime-Erweiterung ist nicht erforderlich. Diese Funktion gibt ein Array ohne Parameter zurück. Das 0. Element ist die Anzahl der Sekunden seit dem Systemstart und das 1. Element ist die entsprechende Nanosekundenzahl. Wenn der Parameter „true“ festgelegt ist, wird direkt der tatsächliche Nanosekunden-Zeitstempel zurückgegeben, verkettet mit Sekunden und Nanosekunden.

echo HRTime\PerformanceCounter::getFrequency(), PHP_EOL; // 1000000000
echo HRTime\PerformanceCounter::getTicks(), PHP_EOL; // 3758428256236
echo HRTime\PerformanceCounter::getTicksSince(1212), PHP_EOL; // 3758428257494

$a = HRTime\PerformanceCounter::getTicks();
echo HRTime\PerformanceCounter::getTicksSince($a), PHP_EOL; // 412
Nach dem Login kopieren

Die nächsten drei Funktionen sind die statischen Funktionen des PerformanceCounter-Objekts in der HRTime-Erweiterung. Das PerformanceCounter-Objekt stellt einen Leistungszähler dar, und getFrequency() stellt die Timer-Frequenz dar (in Ticks/Sekunde). Es ist ersichtlich, dass es die Nanosekundeneinheit zurückgibt, die 1 Milliarde beträgt. getTicks() gibt die aktuelle Tick-Zeit zurück. Es ist ersichtlich, dass das Ergebnis das gleiche ist wie die Funktion hrtime(true), bei der es sich um die Tick-Zeit handelt, die nach dem Systemstart zurückgegeben wird. Die Methode getTicksSince() gibt das Zeitintervall basierend auf der angegebenen Anzahl von Nanosekunden zurück, was date_diff() ähnelt. Tatsächlich ähnelt es unserer Operation time() - time(). Mit dieser Methode können Sie das Zeitintervall zwischen zwei Durchläufen eines Codeabschnitts ermitteln. Die Einheit ist Nanosekunden.

Timer-Funktion

Der nächste Schritt steht im Mittelpunkt unseres Artikels, nämlich die Implementierung der Timer-Funktion. Wie oben erwähnt, kann die Verwendung von getTickSince() tatsächlich das Laufzeitintervall eines Codeabschnitts überwachen, aber was Sie unten lernen werden, ist leistungsfähiger.

$c = new HRTime\StopWatch;

$c->start();
for ($i = 0; $i < 1024*1024; $i++);
echo &#39;isRunning: &#39;, $c->isRunning(), PHP_EOL; // isRunning: 1
$c->stop();

echo 'Time NS: ', $c->getLastElapsedTime(HRTime\Unit::NANOSECOND), PHP_EOL;
echo 'Time US: ', $c->getLastElapsedTime(HRTime\Unit::MICROSECOND), PHP_EOL;
echo 'Time MS: ', $c->getLastElapsedTime(HRTime\Unit::MILLISECOND), PHP_EOL;
echo 'Time S: ', $c->getLastElapsedTime(HRTime\Unit::SECOND), PHP_EOL;
// Time NS: 6929888
// Time US: 6929.888
// Time MS: 6.929888
// Time S: 0.006929888

echo 'Ticks: ',$c->getLastElapsedTicks(), PHP_EOL;
// Ticks: 6929888

echo 'isRunning: ',$c->isRunning(), PHP_EOL;
//
Nach dem Login kopieren

Wir müssen ein StopWatch-Objekt instanziieren und dann seine start()-Methode aufrufen, damit ein Timer gestartet wird. Die englische Bedeutung von StopWatch selbst ist die Bedeutung von Timer, daher ist dieses Objekt speziell für den Betrieb eines Timers konzipiert. Mit der Methode isRunning() können wir feststellen, ob der aktuelle Timer läuft, wenn er nicht im Gültigkeitsbereich von start() und stop( liegt. ), dann wird false zurückgegeben. Im Testcode führen wir eine leere Schleife von 1024*1024 aus und verwenden dann die Methode stop(), um den Timer zu beenden.

Wie aus dem Code hervorgeht, dient getLastElapsedTime() dazu, die Zeitintervallinformationen zwischen start() und stop() unseres obigen Codes abzurufen. Seine Parameter können als Sekunden, Millisekunden, Mikrosekunden und Nanosekunden angegeben werden. Der Sinn dieser Methode selbst besteht darin, die Laufzeit des letzten Intervalls zu ermitteln. getLastElapsedTicks() ruft die Taktinformationen des letzten Intervalls ab. Da es [letztes Mal] vier Wörter gibt, bedeutet dies, dass dieses Objekt für segmentiertes Timing mehrmals aufgerufen werden kann. Darüber hinaus können immer noch mehrere unterschiedliche Zeitpunkte zusammengefasst werden, um alle Zeitintervallinformationen zu erhalten.

// 不在计时范围内
for ($i = 0; $i < 1024*1024; $i++);

$c->start();
for ($i = 0; $i < 1024*1024; $i++);
$c->stop();

echo 'Time NS: ', $c->getLastElapsedTime(HRTime\Unit::NANOSECOND), PHP_EOL;
echo 'Time US: ', $c->getLastElapsedTime(HRTime\Unit::MICROSECOND), PHP_EOL;
echo 'Time MS: ', $c->getLastElapsedTime(HRTime\Unit::MILLISECOND), PHP_EOL;
echo 'Time S: ', $c->getLastElapsedTime(HRTime\Unit::SECOND), PHP_EOL;
// Time NS: 7154010
// Time US: 7154.01
// Time MS: 7.15401
// Time S: 0.00715401

echo 'All Time NS: ', $c->getElapsedTime(HRTime\Unit::NANOSECOND), PHP_EOL;
echo 'All Time US: ', $c->getElapsedTime(HRTime\Unit::MICROSECOND), PHP_EOL;
echo 'All Time MS: ', $c->getElapsedTime(HRTime\Unit::MILLISECOND), PHP_EOL;
echo 'All Time S: ', $c->getElapsedTime(HRTime\Unit::SECOND), PHP_EOL;
// All Time NS: 14083898
// All Time US: 14083.898
// All Time MS: 14.083898
// All Time S: 0.014083898

echo 'All Ticks: ', $c->getElapsedTicks(), PHP_EOL;
// All Ticks: 14083898
Nach dem Login kopieren

In diesem Code haben wir zwischen den beiden Timing-Testcodes einen Schleifentestcode eingefügt, der nicht in den Timing-Daten gezählt wird. Dann starten wir ein neues Timing. Am Ende erhalten wir die gesamte Timing-Zeit durch getElapsedTime() und getElapsedTicks(). Es ist ersichtlich, dass die oben genannten 6929888 plus diese Zeit 7154010 genau 14083898 ergeben. Der mittlere Abschnitt des Schleifencodes, der nicht im Timer enthalten ist, wird nicht in die gesamte Timing-Zeit einbezogen.

Empfohlenes Lernen: „PHP-Video-Tutorial

总结

是不是很有意思,它的作用真的和我们的体育老师所用的那个秒表一模一样,老师们的秒表也都是可以按多次记录第1名到最后1名的全部跑步成绩,并且最后还有一个总的时间,而在代码中我们也是完全相似的操作。这个扩展对于精细的性能调试非常有用,而且也能够针对一些需要这种高精度时间差的业务进行相关的开发。

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/3.学习PHP中的高精度计时器HRTime扩展.php
参考文档:
https://www.php.net/manual/zh/book.hrtime.php
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung der hochpräzisen Timer-HRTime-Erweiterung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage