如何衡量用 PHP 编写代码的速度?

我怎样才能知道哪个类(它们都执行相同的任务)执行得更快呢?有软件可以测量吗?

100025 次浏览

如果是可以在 Web 上下文之外测试的内容,我只需使用 Unixtime命令。

为了快速起见,我这样做(在 PHP 中) :

$startTime = microtime(true);
doTask(); // whatever you want to time
echo "Time:  " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";

您还可以使用像 http://xdebug.org/这样的分析器。

You can use basic stuff like storing timestamps or microtime() before and after an operation to calculate the time needed. That's easy to do, but not very accurate. Maybe a better solution is Xdebug, i've never worked with it but it seems to be the best-known PHP debugger/profiler I can find.

Zend Studio 内置了对使用 XDebug 或 ZendDebugger 进行分析的支持。它会分析你的代码,告诉你每个函数需要多长时间。这是一个很棒的工具,可以帮助你找到瓶颈所在。

你有 (至少)两种解决方案:

相当“天真”的一个是使用微时间(真)到一部分代码之前和之后,以获得在其执行过程中经过了多少时间; 其他答案已经说了,并给出了例子,所以我不会再多说。

如果您希望对几个指令进行基准测试,这是一个很好的解决方案; 例如,比较两种类型的函数——最好是进行数千次,以确保任何“扰动元素”的平均值。

如果你想知道序列化一个数组需要多长时间:

$before = microtime(true);


for ($i=0 ; $i<100000 ; $i++) {
serialize($list);
}


$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";

不是完美的,但是很有用,而且不需要花很多时间来设置。



另一个解决方案是使用:

要获得分析文件,您必须安装和配置 Xdebug; 请查看文档的 分析 PHP 脚本页面。

What I generally do is not enable the profiler by default (它会生成相当大的文件,并减慢速度), but use the possibility to send a parameter called XDEBUG_PROFILE as GET data, to activate profiling just for the page I need.
我的 php.ini 中与分析相关的部分如下所示:

xdebug.profiler_enable = 0              ; Profiling not activated by default
xdebug.profiler_enable_trigger = 1      ; Profiling activated when requested by the GET parameter
xdebug.profiler_output_dir = /tmp/ouput_directory
xdebug.profiler_output_name = files_names

(阅读文档了解更多信息)

This screenshot is from a C++ program in KcacheGrind : http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif
(资料来源: sourceforge.net)

您将得到与 PHP 脚本完全相同的东西; -)
(我的意思是,对于 KCacheGrind,WinCacheGrind 不如 KCacheGrind...)

This allows you to get a nice view of what takes time in your application -- and it sometimes definitly helps to locate function that is slowing everything down ^^

Note that Xdebug counts the CPU time spent by PHP ; when PHP is waiting for an answer from a Database (for instance), it is not working ; only waiting. So Xdebug will think the DB request doesn't take much time !
这应该在 SQL 服务器上进行配置,而不是 PHP,所以..。


希望这对你有所帮助: -)
玩得开心!

我最近一直在使用 XH 教授 http://pecl.php.net/package/xhprof。它最初是由 Facebook 开发的,并且有一个像样的网页界面。

I'd like to share with you a self made function I use to measure the speed of any existing function up to 10 arguments:

function fdump($f_name='', $f_args=array()){


$f_dump=array();
$f_result='';


$f_success=false;


$f_start=microtime();
$f_start=explode(' ', $f_start);
$f_start=$f_start[1] + $f_start[0];


if(function_exists($f_name)){


if(isset($f_args[0])&&is_array($f_args[0])){
if($f_result=$f_name($f_args)){
$f_success=true;
}
}
elseif(!isset($f_args[1])){
if($f_result=$f_name($f_args[0])){
$f_success=true;
}
}
elseif(!isset($f_args[2])){
if($f_result=$f_name($f_args[0],$f_args[1])){
$f_success=true;
}
}
elseif(!isset($f_args[3])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){
$f_success=true;
}
}
elseif(!isset($f_args[4])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){
$f_success=true;
}
}
elseif(!isset($f_args[5])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){
$f_success=true;
}
}
elseif(!isset($f_args[6])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){
$f_success=true;
}
}
elseif(!isset($f_args[7])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){
$f_success=true;
}
}
elseif(!isset($f_args[8])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){
$f_success=true;
}
}
elseif(!isset($f_args[9])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){
$f_success=true;
}
}
elseif(!isset($f_args[10])){
if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){
$f_success=true;
}
}
}
$f_end=microtime();
$f_end=explode(' ', $f_end);
$f_end=$f_end[1] + $f_end[0];


$f_time=round(($f_end - $f_start), 4);
$f_dump['f_success']=$f_success;
$f_dump['f_time']=$f_time;
$f_dump['f_result']=$f_result;


var_dump($f_dump);exit;


//return $f_result;


}

例子

function do_stuff($arg1='', $arg2=''){
return $arg1.' '.$arg2;
}


fdump('do_stuff',array('hello', 'world'));

报税表

  array(3) {
["f_success"]=>
bool(true)
["f_time"]=>
float(0)            //too fast...
["f_result"]=>
string(11) "hello world"
}

我做了一个简单的计时课程,也许对某些人有用:

class TimingHelper {


private $start;


public function __construct() {
$this->start = microtime(true);
}


public function start() {
$this->start = microtime(true);
}


public function segs() {
return microtime(true) - $this->start;
}


public function time() {
$segs = $this->segs();
$days = floor($segs / 86400);
$segs -= $days * 86400;
$hours = floor($segs / 3600);
$segs -= $hours * 3600;
$mins = floor($segs / 60);
$segs -= $mins * 60;
$microsegs = ($segs - floor($segs)) * 1000;
$segs = floor($segs);


return
(empty($days) ? "" : $days . "d ") .
(empty($hours) ? "" : $hours . "h ") .
(empty($mins) ? "" : $mins . "m ") .
$segs . "s " .
$microsegs . "ms";
}


}

用途:

$th = new TimingHelper();
<..code being mesured..>
echo $th->time();
$th->start(); // if it's the case
<..code being mesured..>
echo $th->time();


// result: 4d 17h 34m 57s 0.00095367431640625ms

如果你想快速测试一个框架的性能,你可以放入 Index.php文件

//at beginning
$milliseconds = round(microtime(true) * 1000);


//and at the end
echo round(microtime(true) * 1000) - $milliseconds;

每次在 毫秒中你都会得到执行时间,因为微秒在测试框架案例中并不太有用。

2020年最新情况

距离我上次回答这个问题已经很多年了,所以我认为应该更新 APM 的版本。

  • AppDynamics 已被思科(Cisco)收购,他们过去提供的免费永久账户已从其网站上删除。
  • NewRelic 已经将价格从每月149美元/主机降至每月25美元/主机,以与 APM 市场的新进入者 Datadog 竞争,后者提供每月31美元/主机。
  • DatadogAPM 功能仍然很轻,还有很多需要改进的地方。然而,我看到他们在接下来的一年中不断加强和改进。
  • Ruxit has been bought by Dynatrace. No shocker here as Ruxit is built by ex Dynatrace Employees. This allowed Dynatrace to transform to a truly SaaS model for better. Say goodbye to that bulky Java client if you'd like to.
  • There are free/open-source options now as well. Checkout 阿帕奇天行者 which is very popular in China among their top tech companies and PinPoint which offers a demo that you can try before installing. Both of these require you manage hosting so get ready to spin up few Virtual Machine and spend some time with installation and configuration.
  • 我没有尝试过这些开源 APM 解决方案,所以我没有资格推荐它们,但是,我个人已经为多个组织部署了所有这些 APM 解决方案,无论是在本地还是在云上,针对数百个应用程序/微服务。所以我可以很有信心地说,如果任何一个供应商符合你的要求,你都不会出错。


原文发表于2015年10月

这是对你问题的直接回答

有软件可以测量吗?

有的。我想知道为什么还没有人提起过。虽然上面建议的答案对于快速检查来说看起来不错,但是对于长期或者更大的项目来说是不可伸缩的。

Why not use an Application Performance Monitoring (APM) tool which are build exactly for that and so much more. Check out NewRelic, AppDynamics, Ruxit (all have free version) to monitor the execution time, resource usage, throughput of every application to the method level.