我倾向于使用通常的方法检查PHP的速度。

<?php
$timer_start = microtime(TRUE);
/*
    some code here that I want to time
*/
$timer_end = microtime(TRUE);
echo($timer_end - $timer_start);
exit();
?>


我该如何计时PHP的microtime函数本身的两次调用占用了多少时间?

最佳答案

答案是:“您不能-意思是:您的计时结果将不会100%准确!”。

事实是,逻辑已经暗示时间“ PHP的microtime函数本身的两次调用使用了多少时间”并没有100%准确的结果,因为您总是会最终包括(至少)在您的时间安排一个变量分配。

因此,这是您将获得的最接近的信息:

  <?php
  // start the timer
  $timer_start = microtime(TRUE);
  // Call microtime once (we want to calculate time wasted by microtime 2 calls)
  microtime(TRUE);
  // stop the timer and return the result
  echo(((microtime(TRUE) - $timer_start)*1000).' microseconds');
  exit();
  ?>


如果您看上面的代码,您会发现我没有使用$timer_end = microtime(TRUE);,因为那样会浪费时间在变量赋值上,可以通过直截了当地获取microtime调用的返回值并减去开始时间来避免:(microtime(TRUE) - $timer_start)

很好,但是没有办法使PHP记住开始时间而不将其分配给变量,这意味着:您将始终执行某种$timer_start = microtime(TRUE);,而无法避免初始化$timer_start变量–浪费时间。浪费的时间包含在我们的最终结果中。没有办法解决这个问题。

解释一下我的意思:我们可以通过替换来避免在时序结束时分配变量

$timer_end = microtime(TRUE);
echo($timer_end - $timer_start);




echo(microtime(TRUE) - $timer_start);


但是我们不能对$timer_start = microtime(TRUE);做同样的事情。

无论我们如何尝试解决该问题,我们都将始终执行以下操作:


致电microtime(TRUE)
用返回值$timer_start初始化microtime(TRUE)的浪费时间(请参阅“ 1.”),
microtime(TRUE)什么都不做,
调用microtime(TRUE)并从中减去开始时间(请参阅“ 2.”)。


您需要点“ 2”。记住开始时间。您不能以任何方式跳过该变量分配或解决该问题。无论您做什么,都将始终在计时结果中包含变量分配。更糟糕的是:您永远不会知道在变量分配过程中浪费了多少时间,从而使结果不正确(更好:不是100%正确)。

为了帮助您理解它……关于问题以及我在此答案开头提供的代码,可以将问题可视化为:



解释它:microtime将知道返回它的值之前的确切时间–因此我们将不会获得返回的确切值(但非常接近)。然后,需要将返回值分配给一个变量,以便我们可以记住它-这需要花费更多时间,而这与我们实际想要的时间无关。

总结:您可以接近,但返回值永远不会是100%正确的。如果您已经了解了我上面所解释的内容,那么现在您将知道,无论您使用PHP进行计时如何,都将始终包括浪费在该“记住开始时间”变量初始化上的时间。

即使您创建一个只包含<?php microtime(); microtime(); ?>的脚本并使用外部程序……您也会注意到,除了将问题转移到外部程序之外,您什么都没有做。外部程序将具有可视化显示的相同问题,因为外部程序也必须通过初始化变量来记住启动时间,这意味着外部程序也将无法正确计时。

最后,我的问题最终变成了一个脑筋急转弯,以PHP为例来思考定时程序,循环和函数背后的逻辑。正如我的回答所解释的,使用哪种编码语言都没有关系,您总是会遇到同样的问题。

我将由您来决定是否应该考虑您的计时过程结果中包含的“浪费时间”,或者是否可以在您的情况下忽略它?但是就“精确”时间而言,不可否认的是,我们的结果中总是会包含变量分配所浪费的一小部分时间。可以获取时间但实际上并不属于我们真正想要的时间的最小时间跨度。因此,结果永远不会是100%准确的-因为如果您不动脑子就不会记住某件事。从这个角度来看,事情突然开始听起来很简单……不是吗? ;)

10-07 17:27