Alpha2新功能之XHProf

XHProf是Facebook放出的轻量级调试工具.和Xdebug相比,XHProf更加易用和可控.尤其是生成流程图和调试数据对比的功能很好很强大.

在Alpha2中,SAE已经集成了XHProf工具,从此大家可以方便的利用XHProf进行调优了.

下边我们就来看看如何使用吧.

初始化存储

首先要说明的,调试的数据是存放在用户自己的Storage中的,所以需要在Storage中创建一个专用的domain来存放.

进入Storage,新建一个名为 xhprof 的domain.

捕获数据

然后,我们在需要调试的页面进行数据捕获.

在要进行调优的代码前后分别加上 sae_xhprof_start() 和 sae_xhprof_end() 就可以了.

这里以 开发手册之开发实例PPT中的图片书签 为例.我们给图片处理部分加上调试代码.

if( isset( $_REQUEST['pic_url'] ) )
{
sae_xhprof_start();
$header = $error = '';
if( !$img_data = fetch_url( $_REQUEST['pic_url'] , AKEY , SKEY , $header , $error ))
die( 'can\'t get contents of ' . $_REQUEST['pic_url'] . ' error : ' . $error );
$img = sae_image_init( AKEY , SKEY , $img_data );
$img_data = $img->convertFormat('png');
$small_data = $img->resize( 100 );

$name = time() ;
$s = sae_storage_init( AKEY , SKEY );

if( !$s->writeData( ST_DOMAIN , 'photo_' . $name . '.png' , $img_data ) )
die( 'save img data error' );
else
$url = $s->getFileUrl( ST_DOMAIN , 'photo_' . $name . '.png' );

if( !$s->writeData( ST_DOMAIN , 'photo_small_' . $name . '.png' , $small_data ) )
die( 'save img data error' );
else
$small_url = $s->getFileUrl( ST_DOMAIN , 'photo_small_' . $name . '.png' );

$sql = "INSERT INTO `pic` ( `url` , `small_url` , `timeline` ) VALUES ( '" . $mysql->escape( $url ) . "' , '" . $mysql->escape( $small_url ) . "' , NOW() )";

$mysql->run_sql( $sql );
if( $mysql->errno() != 0 )
die( 'Mysql error ' . $mysql->error() );

echo '
数据成功保存
';
sae_xhprof_end();
}

查看结果

现在我们保存一张图片.然后进入XHProf页面,就能看到刚才的调试数据了.

点击查看链接,就能看到之前产生的调试数据.

通过表格,我们可以清楚的看到每一个函数消耗的时间.更强大的是,点击

[View Full Callgraph]

可以以图像的方式展现本次调试数据.由于生成图像对CPU的消耗还是比较大,目前每个应用每天可以生成100张调试图.

上图就是本次访问的详细过程,点击可以查看大图.其中最消耗时间的部分已经加粗和标红了.

可以看到,图像处理接口是耗时最多的部分.

按条件生成数据

我们并不想用户每次访问都生成调试数据,一来会降低程序的性能,二来也会浪费存储空间.其实只要按条件调用sae_xhprof_*函数就可以了.

比如,每10000次请求,记录一次随机数据.

if( rand( 1,10000 ) == 2 )
{
$xh_open = true;
sae_xhprof_start();
}
// 业务代码

if( isset( $xh_open ) && $xh_open )
{
sae_xhprof_end();
}

或者,传入?debug=1时才记录.

if( isset( $_REQUEST['debug'] ) && $_REQUEST['debug']  == 1 )
{
$xh_open = true;
sae_xhprof_start();
}
// 业务代码

if( isset( $xh_open ) && $xh_open )
{
sae_xhprof_end();
}

调试数据对比

更NB的是,XHProf还支持调试数据的对比.我们修改原来的代码,换用新的接口,然后捕捉新的数据.

重新保存一张图片后,刷新 XHProf服务的页面,已经有多条记录了.

划选两行数据记录最前边的复选框后,会出现比较链接.

点击”比较选中项”.可以查看到两次数据的对比.其中绿色是速度有改进的地方,红色是速度反而变慢的地方.

点击[View Regressions/Improvements using Callgraph Diff],可以通过图像来观察这次的改进.

就像大家看到的,XHProf是非常有用的一个工具,即使是在SAE平台以外开发,也很推荐大家安装使用.

有了如此强大的调试工具,各位更是如虎添翼,期待大家写出更精彩的代码.

Comment

  • Trackback are closed
  • Comments (21)
    • Timmy
    • 12/31. 2009 6:31下午

    整个个激活码用用才是王道

  1. 新浪能这样支持开源真不容易!

  2. 我要激活码

  3. 给个邀请码吧,haorena#gmail.com

    • 我要邀请码
    • 01/01. 2010 2:14下午

    我要邀请码
    hajiaren@gmail.com

  4. 我要激活码

    • kcvg
    • 01/03. 2010 10:27下午

    别急快了.

  5. 的确 没有激活码 叫我怎么活啊

    • roserouge
    • 01/05. 2010 5:32下午

    我要激活码 2

    • lulu
    • 01/05. 2010 5:46下午

    我也要啊~

    • weiertzw
    • 01/10. 2010 1:47下午

    什么时候可以对外公测呢?一个测试要是太久没退出的话我想关注的动力也就没了!

    • milo
    • 01/11. 2010 10:01上午

    我也要邀请码,邀请码~

    • weiertzw
    • 01/11. 2010 9:46下午

    何时能像Google那样进行大量测试,至少给个倒计时之类的发布日期呀!!!没有期待哪有希望!!!

    • wiigin
    • 01/15. 2010 1:15上午

    这个功能对于日后的分析很有用~

    真希望能快点拿到邀请码进行测试

  6. 同求激活码~

    • fffdd
    • 01/20. 2010 10:19下午

    停产了???

    • hanwei
    • 01/21. 2010 5:49下午

    申请码什么时候发啊?

    • Erik
    • 01/21. 2010 5:50下午

    求激活码,很期待啊

    • yangball
    • 01/22. 2010 1:33下午

    激活码啊。我要激活码。谢谢

    • dongz
    • 01/26. 2010 4:35下午

    给个下次测试的大概时间吧

    • axpwx
    • 01/31. 2010 4:47下午

    什么时候出Beta啊?

Comment are closed.