设为首页 收藏本站
查看: 1258|回复: 0

[经验分享] perl 代码优化

[复制链接]

尚未签到

发表于 2017-5-19 11:05:56 | 显示全部楼层 |阅读模式
做代码优化首先要知道程序各部分的速度,什么地方最慢,最需要优化。
下面有几种方法可以用于调查程序各部分的速度。

1. time

shell>time perl script.pl

这样可以得到程序的运行时间。

2. Time::HiRes
使用模块Time::HiRes中的函数gettimeofday,gettimeofday
例:

for (xxx) {
# code 1
    $t0 = [gettimeofday];
# code 2
    $elapsed = tv_interval ( $t0 );
    $t += $slapsed;
# code 3
}

这样$t中就是代码段code 2在程序中执行总共需要的时间。这个结果是精确到微秒的。

3. Devel::DProf

# test.pl
sub d {
print 1;
}

sub g{
print 1 for 1..10;
}

sub f {
print 2;
}

for (1..10000){
d();
g();
f();
g();
}

# script end

shell>perl -d:DProf test.pl
shell>dprofpp
Total Elapsed Time = 0.289990 Seconds
  User+System Time = 0.269990 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
85.1   0.230  0.230  20000   0.0000 0.0000  main::g
14.8   0.040  0.040  10000   0.0000 0.0000  main::f
11.1   0.030  0.030  10000   0.0000 0.0000  main::d

4. Devel::SmallProf
shell>perl -d:SmallProf  test.pl

shell>cat smallprof.out
           ================ SmallProf version 1.15 ================
                                Profile of a.pl                        Page 1
       =================================================================
    count wall tm  cpu time line
    10000 0.000000 0.000000     1:sub d {
    10000 0.062426 0.090000     2:print 1;
        0 0.000000 0.000000     3:}
        0 0.000000 0.000000     4:
    20000 0.000000 0.000000     5:sub g{
    40000 0.390327 0.550000     6:print 1 for 1..10;
        0 0.000000 0.000000     7:}
        0 0.000000 0.000000     8:
    10000 0.000000 0.000000     9:sub f {
    10000 0.061660 0.100000    10:print 2;
        0 0.000000 0.000000    11:}
        0 0.000000 0.000000    12:
        1 0.000006 0.000000    13:for (1..10000){
    10000 0.036328 0.090000    14:d();
    10000 0.037353 0.160000    15:g();
    10000 0.038129 0.220000    16:f();
    10000 0.038368 0.150000    17:g();
        0 0.000000 0.000000    18:}
        0 0.000000 0.000000    19:

shell>sort -k 2nr,2 smallprof.out
    40000 0.390327 0.550000     6:print 1 for 1..10;
    10000 0.062426 0.090000     2:print 1;
    10000 0.061660 0.100000    10:print 2;
    10000 0.038368 0.150000    17:g();
    10000 0.038129 0.220000    16:f();
    10000 0.037353 0.160000    15:g();
    10000 0.036328 0.090000    14:d();
        1 0.000006 0.000000    13:for (1..10000){
       =================================================================
        0 0.000000 0.000000    11:}
        0 0.000000 0.000000    12:
        0 0.000000 0.000000    18:}
        0 0.000000 0.000000    19:
        0 0.000000 0.000000     3:}
        0 0.000000 0.000000     4:
        0 0.000000 0.000000     7:}
        0 0.000000 0.000000     8:
    10000 0.000000 0.000000     1:sub d {
    10000 0.000000 0.000000     9:sub f {
    20000 0.000000 0.000000     5:sub g{
    count wall tm  cpu time line
                                Profile of a.pl                        Page 1
           ================ SmallProf version 1.15 ================


程序改进之后如果想知道效果如何,可以使用模块Benchmark。
例:

use Benchmark qw/timethse/;
timethese($count, {
    'before' => sub { ...code1... },
    'after'    => sub { ...code2... },
});

上面这些模块的详细说明见各自的文档。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379037-1-1.html 上篇帖子: Note of Learning Perl--Filehandles and File Tests 下篇帖子: 初学练习,用Perl写的命令行五子棋
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表