用 PHP 衡量(和改进)性能的最佳方法是啥?

Posted

技术标签:

【中文标题】用 PHP 衡量(和改进)性能的最佳方法是啥?【英文标题】:best way to measure (and refine) performance with PHP?用 PHP 衡量(和改进)性能的最佳方法是什么? 【发布时间】:2010-10-07 09:02:19 【问题描述】:

我正在使用的一个网站开始变得有点迟钝,我想改进它。我认为问题出在 php 上,但我不能确定。如何查看函数执行需要多长时间?

【问题讨论】:

看看***.com/questions/55720/… 【参考方案1】:

如果要测试执行时间:

<?php
    $startTime = microtime(true);  
    // Your content to test
    $endTime = microtime(true);  
    $elapsed = $endTime - $startTime;
    echo "Execution time : $elapsed seconds";
?>

【讨论】:

【参考方案2】:

试试 XDebug 或 Zend Debugger 中的分析器功能?

【讨论】:

使用这些有很多学习曲线吗?目前我使用 textmate、firefox、firebug 和 firephp 的组合(上帝派!) 与您当前的设置相比,XDebug 和 Zend Debugger 处于不同的联盟。我发现 Zend Debugger 非常容易使用(我使用 Zend Studio)。如果您想要认真优化,那么我建议您使用其中之一。【参考方案3】:

你可以做两件事。 随处放置 Microtime 调用,但如果您想测试多个函数,它并不方便。因此,如果您想测试我假设您想做的许多功能,那么有一种更简单的方法可以实现更好的解决方案。 只需上一堂课(单击链接以跟随教程),您可以在其中测试所有功能需要多长时间。而不是到处放置微时间。你只需使用这个类。很方便

http://codeaid.net/php/calculate-script-execution-time-%28php-class%29

您可以做的第二件事是通过查看内存使用情况来优化您的脚本。 通过观察脚本的内存使用情况,您可以更好地优化代码。

PHP 有一个垃圾收集器和一个相当复杂的内存管理器。脚本使用的内存量。在脚本执行期间可以上下移动。要获取当前内存使用情况,我们可以使用 memory_get_usage() 函数,而要获取任何时候使用的最高内存量,我们可以使用 memory_get_peak_usage() 函数。 将纯副本查看到剪贴板打印?

   echo "Initial: ".memory_get_usage()." bytes \n";  
   /* prints 
   Initial: 361400 bytes 
   */  

   // let's use up some memory  
   for ($i = 0; $i < 100000; $i++)   
       $array []= md5($i);  
     

  // let's remove half of the array  
  for ($i = 0; $i < 100000; $i++)   
     unset($array[$i]);  
    

  echo "Final: ".memory_get_usage()." bytes \n";  
  /* prints 
  Final: 885912 bytes 
  */  

  echo "Peak: ".memory_get_peak_usage()." bytes \n";  
  /* prints 
  Peak: 13687072 bytes 
  */  

http://net.tutsplus.com/tutorials/php/9-useful-php-functions-and-features-you-need-to-know/

PK

【讨论】:

【参考方案4】:

您也可以手动制作,方法是在各个位置记录 microtime() 值,如下所示:

<?
$TIMER['start']=microtime(TRUE);
// some code
$query="SELECT ...";
$TIMER['before q']=microtime(TRUE);
$res=mysql_query($query);
$TIMER['after q']=microtime(TRUE);  
while ($row = mysql_fetch_array($res)) 
// some code

$TIMER['array filled']=microtime(TRUE);  
// some code
$TIMER['pagination']=microtime(TRUE);  
/and so on
?>

然后将其可视化

<?
if ('127.0.0.1' === $_SERVER['REMOTE_ADDR']) 
  echo "<table border=1><tr><td>name</td><td>so far</td><td>delta</td><td>per cent</td></tr>";
  reset($TIMER);
  $start=$prev=current($TIMER);
  $total=end($TIMER)-$start;
  foreach($TIMER as $name => $value) 
    $sofar=round($value-$start,3);
    $delta=round($value-$prev,3);
    $percent=round($delta/$total*100);
    echo "<tr><td>$name</td><td>$sofar</td><td>$delta</td><td>$percent</td></tr>";
    $prev=$value;
  
    echo "</table>";

?>

IP 地址检查意味着我们正在工作站点上进行此分析

虽然我怀疑它是 PHP 本身。很可能是数据库。所以,要特别注意查询的执行时间。

但是,“站点”一词非常宽泛。它还包括 JS、CSS、图像和其他东西。所以,我建议从 FirebFug 的网页开始,看看整个页面的哪个部分需要更多时间。

当然,精炼只能在分析分析结果后进行,如果没有它,这里就不建议了。

【讨论】:

我认为它是后端的原因是因为 firebug 配置文件需要一段时间才能启动。它滞后于对服务器的调用。它也在本地执行,因此在我看来,这排除了服务器性能,尽管我远非服务器专家。 数据库查询是由 wordpress API 处理的,所以不确定在不重写***的情况下我能做多少,这会在一定程度上否定使用 wordpress 的意义。 @Mild PHP 后端当然也暗示 SQL 调用。 SQL 是后端工作的一部分。无论如何,只有分析才能告诉我们【参考方案5】:

您最好的选择是 Xdebug。我很高兴它捆绑在我的 PHPed IDE 中。我可以通过单击按钮获取分析器数据。

所以也许你可以考虑一下。

【讨论】:

您不能使用您宝贵的 IDE 来分析远程服务器。至少除非在那里安装了 xdebug 扩展。而本地开发服务器的分析几乎没用 我认为本地分析是没有用的。虽然两台机器上的性能数据可能不一样,但负载的比例仍然存在,因此您仍然可以找到瓶颈。【参考方案6】:

我有类似的问题,所以我在数据库上创建了 2 个新表和两个新函数。一个是audit_sql,另一个是audit_code。因为我使用了一个 SQL 抽象类,所以很容易对每个 SQL 调用进行计时(我使用了 php microtime,正如其他人所建议的那样)。因此,我在 SQL 调用前后调用了 microtime,并将结果存储在数据库中。

与页面类似。我在每个页面的开头和结尾调用了 microtime,如果有必要,在函数、div 的开头和结尾调用了 microtime——我认为可能是罪魁祸首。

一般结果是:

    对 MySQL 的 SQL 调用几乎是即时的,根本没有问题。我唯一想说的是,即使我对被处决的人数也感到惊讶!该站点是从数据库生成的——甚至是菜单、权限等。为了生成主页,SQL 调用以 100 秒为单位进行测量。

    PHP 不是罪魁祸首。这比 MySQL 更加即时。

    罪魁祸首是....(大增!)调用 You Tube 和 Picassa 以及其他类似网站。我在网站上托管视频和相册(嗯,我实际上并没有存储它们 - 它们存储在 YT 等上),主页上是通过 You Tube PHP API 从 You Tube 等中提取的缩略图/Zend 框架。因为这都是基于其他站点的 http,所以每个站点都需要 1、2 或 3 秒。这导致包含这些的 div 需要 6 到 12 秒,而主页则需要 17 秒。

解决方案 - 将所有缩略图存储在我的服务器上。第一次必须从远程站点(YT、Picassa 等)提供服务,然后将其存储在您自己的站点上。将来,您检查是否有它,如果有,则始终从您的服务器上提供它。将页面加载时间缩短到 2-3 秒。在有人加载更多视频/图像后,第一个查看第一个主页加载的人需要一些时间,但此后不会。人们通常会将较长的一次性页面加载时间归结为他们的连接/互联网。您的网站加载速度太慢,他们将停止访问!

希望对你有所帮助。

【讨论】:

以上是关于用 PHP 衡量(和改进)性能的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

DateTime.Now 是衡量函数性能的最佳方法吗? [关闭]

衡量 iOS 应用性能的策略

oracle中查询性能的衡量方法

qps是啥

常见相似度衡量方法

衡量机器学习模型的三大指标:准确率精度和召回率。