2005-12-11

When perl is not quite fast enough

来源: 本站收集整理 作者:佚名 评论 0 条
 
but don't blow it
You can use the qr// operator to pre-compile your regexps. It often is the easiest way to write regexp components to build up more complex regexps. Using it to build your regexps once is a good idea. But don't screw up (like parrot's assemble.pl did) by telling perl to recompile the same regexp every time you enter a subroutine:
    sub foo {

        my $reg1 = qr/.../;

        my $reg2 = qr/... $reg1 .../;

You should pull those two regexp definitions out of the subroutine into package variables, or file scoped lexicals.

Devel::DProf

You find what is slow by using a profiler. People often guess where they think their program is slow, and get it hopelessly wrong. Use a profiler.

Devel::DProf is in the perl core from version 5.6. If you're using an earlier perl you can get it from CPAN.

You run your program with -d:DProf

    perl5.8.0 -d:DProf enc2xs.orig -Q -O -o /dev/null ...

which times things and stores the data in a file named tmon.out. Then you run dprofpp to process the tmon.out file, and produce meaningful summary information. This excerpt is the default length and format, but you can use options to change things - see the man page. It also seems to show up a minor bug in dprofpp, because it manages to total things up to get 106%. While that's not right, it doesn't affect the explanation.

    Total Elapsed Time = 66.85123 Seconds

      User System Time = 62.35543 Seconds

    Exclusive Times

    %Time ExclSec CumulS #Calls sec/call Csec/c  Name

     106.   66.70 102.59 218881   0.0003 0.0005  main::enter

     49.5   30.86 91.767      6   5.1443 15.294  main::compile_ucm

     19.2   12.01  8.333  45242   0.0003 0.0002  main::encode_U

     4.74   2.953  1.078  45242   0.0001 0.0000  utf8::unicode_to_native

     4.16   2.595  0.718  45242   0.0001 0.0000  utf8::encode

     0.09   0.055  0.054      5   0.0109 0.0108  main::BEGIN

     0.01   0.008  0.008      1   0.0078 0.0078  Getopt::Std::getopts

     0.00   0.000 -0.000      1   0.0000      -  Exporter::import

     0.00   0.000 -0.000      3   0.0000      -  strict::bits

     0.00   0.000 -0.000      1   0.0000      -  strict::import

     0.00   0.000 -0.000      2   0.0000      -  strict::unimport

At the top of the list, the subroutine enter takes about half the total CPU time, with 200,000 calls, each very fast. That makes it a good candidate to optimise, because all you have to do is make a slight change that gives a small speedup, and that gain will be magnified 200,000 times. [It turned out that enter was tail recursive, and part of the speed gain I got was by making it loop instead]
共13页: 上一页 [1] [2] [3] [4] [5] [6] 7 [8] [9] [10] [11] [12] [13] 下一页

(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:被百度降权后,网站该怎么办?  
下一篇:SQL Server2000数据库文件损坏时如何恢复
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号