_PROFILE=1 追加到 URL 中,或者,像下 面一样,将参数嵌入到表单中。
作为一个示例,我们来分析一下这个简单的 ACME Fibonacci Maker, fibonacci.php,如清单 5 所示。为方便起见,将 XDEBUG_PROFILE 参数设置在 表单的隐藏变量内。(当代码投入生产时,很可能将禁用 Xdebug,呈现这个变 量将不会造成什么损失。)
清单 5. Fibonacci.php
Try the ACME Fibonacci Maker!
"st", 2 => "nd", 3 => "rd" ); if ( $_REQUEST['n'] < 4 || $_REQUEST['n'] > 20 ) { $suffix = $suffix[$n]; } else { $suffix = 'th'; } echo '
The ' . $_REQUEST['n'] . $suffix .' Fibonacci number is '; echo fib( $_REQUEST['n'] ) . '
'; }
?>
将浏览器指向 localhost/fibonacci.php(或者合适的 URL)并输入数 字 —— 比如,16。其结果 —— Fibonacci 系列的第 16 个元素 —— 如图 2 所示。
图 2. 示例 Fibonacci 应用程序
如果将分析器输出目录中的内容(名为 php.ini)列出来的话,应该能看到类似 cachegrind.out.951917687 这样名称的文件。 cachegrind.out. 前缀是固定的。 默认情况下, 数值后缀是目录路径到 fibonacci.php 文件的 CRC32 散列。 因此, 如果每一个应用程序都位于自己的目录, 那么每个程序的输出将根据文件名而被 分隔。(如果您更喜欢将输出与时间相关联,将下面这行代码: xdebug.profiler_output_name = timestamp
添加到 php.ini。) 从终端窗口启动 KCacheGrind 并打开 cachegrind.out.951917687。 将立即打开 一个类似于图 3 的新窗口。
图 3. KCacheGrind 应用程序
单击 Callees 选项卡,双击源代码中突出显示的行,并从 Grouping
列表选择 Source File 。所看到的视图应变为类似图 4 所示的内容。
图 4. 查看结果
正如您预期的一样,实际上全部的处理时间(70,989 毫秒的 99.87%)都花费在 3193 次对 fib() 函数的调用上了。要加快该应用程序(随着进一步执行 Fibonacci 序列,程序会随之变慢),应该避免重新计算 Fibonacci 数字这样 代价高昂的重复工作。事实上,ACME Fibonacci Maker 能够很好地进行计算重 用。 下面展示了 fib() 函数的优化版本。新的版本用内存换来了时间上的节省,因 为它保留了中间的计算以便以后使用。 5 展示了分析结果: 与上次的 3192 次 图 函数调用相比,这里仅需要 30 次调用(并且只有一半的调用需要计算结果), 而时间则减少为只有 20 毫秒。
清单 6. 更新了的 fib() 函数 function fib($nth = 1) { static $fibs = array(); if ( ! empty ($fibs[$nth] ) ) { return( $fibs[$nth] ); } if ( $nth < 2 ) {
$fibs[$nth] = $nth; } else { $fibs[$nth - 1] = fib( $nth - 1 ); $fibs[$nth - 2] = fib( $nth - 2 ); $fibs[$nth] = $fibs[$nth - 1] + $fibs[$nth -2]; } return( $fibs[$n