测量php脚本的实际执行时间

时间:2015-12-17 05:47:54

标签: php mysql query-optimization

我想测试脚本的实际速度。 我在下面运行查询。

 $query="select * from test";

  $msc = microtime(true);
  for ($i = 0; $i <= 99999; $i++)
        $rs = mysql_query($query);
    $msc = microtime(true) - $msc;
    echo $msc . ' s'; // in seconds
    echo "<br>";
    echo ($msc * 1000) . ' ms'; // in milliseconds

我尝试使用不同的优化查询上面的代码。还是有相同的输出
$query="select * from stud"; $query2="select name from stud"

有相同的结果运行两个查询运行一千次使用for循环..请有任何其他正确的方法来找出脚本的实际执行时间。

3 个答案:

答案 0 :(得分:0)

  

如果您在second.php文件中编写代码并让first.php文件计算脚本的实际执行时间,该怎么办?

# file: `first.php`
$init_time = time();
# Execute Your Script `second.php`
# Assuming php is properly installed
$output = `php second.php`;
$exit_time = time();
echo $exit_time - $init_time;
  

编辑:可能是,你是对的,你将得到相同的执行时间,因为在这两种情况下,你只是运行那些MySQL查询1000次。您没有处理PHP-MySQL Driver返回的数据。

答案 1 :(得分:0)

通过一次迭代,您可以获得足够好的时间。然而,...

查询的第一次执行可能比第二次(和所有后续调用 - 非常一致的时序)慢得多。 第一次执行可能会遇到冷缓存 - 因此需要完成更多的I / O.所以......

我会计算同一语句的第二次执行时间。但...

如果你有&#34;查询缓存&#34;打开,第二个将是&#34;瞬间&#34;所以不是一个好时机。所以......

始终执行时间测试:SELECT SQL_NO_CACHE ...

其他问题......

不要使用已弃用的mysql_*接口;更改为mysqli_*PDO

在您的特定代码中,由于重复,您可能应该除以100000。

对于像MySQL语句这样的东西,FOR循环的开销只有很小的百分比。但是如果你计算一些更快的函数(大多数PHP内置函数),你需要估计FOR循环时间并将其减去。 (这可以通过计算一个空循环来完成.PHP不够聪明,无法优化无用的代码。在语句级别也不是MySQL .MySQL会清理像WHERE 1=1 AND ...这样的东西。)

(我知道这一切,因为我通常用microtime(true)调用我的PHP代码。通常我在子例程级别执行;稍后在必要时深入查看单个SQL查询。)

答案 2 :(得分:0)

您最初表示要测量PHP代码执行速度,但我担心您实际使用的是对不同的SQL查询进行基准测试,因此请在此处介绍这两种情况。

测量PHP代码执行速度

简单明了,使用timeit来衡量PHP的速度。将代码编写到时间代码并不是一项简单的任务,并且不需要自己编写代码。

测量SQL速度

在这种情况下,您应该尝试尽可能直接接近MySQL服务器。这意味着在数据库服务器中运行查询,而不是使用PHP / Web服务器,因为这些可以添加自己的开销。一个好的方便的方法是使用mysql CLI客户端:

$ mysql -vvv -q -e 'SELECT SQL_NO_CACHE nid FROM node' drupal | grep 'rows in set'
87281 rows in set (0.00 sec)
$ mysql -vvv -q -e 'SELECT SQL_NO_CACHE * FROM node' drupal | grep 'rows in set'
87281 rows in set (0.02 sec)

注意:

  1. 在繁忙的数据库中进行SQL速度测量是没有意义的。使用隔离的服务器和实例
  2. 运行查询几次。丢弃最快和最慢的样本。其余的平均值
  3. 不要忘记SQL_NO_CACHE指令和-q参数
  4. 由于网络/服务器/ MySQL抖动,我不会为0.01范围内的可重复测量差异而烦恼。