2005-12-11

When perl is not quite fast enough

来源: 本站收集整理 作者:佚名 评论 0 条
  Original URL:http://www.ccl4.org/~nick/P/Fast_Enough/


  • When perl is not quite fast enough
    • 简介
    • 一些明显的事
    • 某些折衷/Compromises
    • 放逐愚蠢的魔鬼/Banish the demons of stupidity
    • 间断
    • 测试
    • What causes slowness
    • Step by step
    • 简单的小事
    • 无关的倒入会变慢
    • regexps
    • Devel::DProf
    • Benchmark
    • What causes slowness in perl?
    • Ops are bad, m'kay
    • Memoize
    • Miscellaneous
    • yay for y
    • Ops are bad, m'kay
    • How to make perl fast enough

When perl is not quite fast enough

此份手稿是为了我在 YAPC::EU::2002 上的讲演而预备的。它不是我实际上所说讲演的抄本,更合适的说法是,它只是转成幻灯片的 pod 笔记,一些随手写在纸上或存在脑中的笔记,我试着将它们做成连贯的文章。我还试着增加一些有用的反馈 - 有时我能记起这是谁说的,在此感谢他们。

您可以按此查看幻灯片,我希望找到幻灯片做了哪些改变是显而易见的。

简介

你可能有些 Perl 程序,但是它们运行得很慢。然后你很想对此做些改变。此文讲述了怎样对程序提速和怎样及时地避免问题。

一些明显的事

寻找更好的算法
您的程序运行在您所想的最有效的方法之上。但是很有可能别人从另一个完全不同的角度看问题,从而找到一个快 100 倍的算法。您确定你使用了最好的算法?做些研究吧。
使用更好的硬件
假如您的程序不是在许多台机子上运行,或许使用更好的硬件会比较便宜。究竟硬件是越来越便宜而程序员要付高工资。或许你能通过改变硬件而获得高性能;也有可能给您的机子编译一个自定义内核就足够了。
mod_perl
对于我所写的 CGI 程序,我发现即使我削减了所有可以削减的,服务器还是只能每秒供给 2.5 。而运行在同一机子上同样的代码,不同的是使用了 mod_perl ,它能每秒供给 25 。这是一个不费很大力气就能做 10 倍提速的方法。假如您的代码不适合于运行在 mod_perl 下,这里还有 fastcgi (CGI.pm 支持)。假如您的程序不是 CGI ,可以考虑持续性的 perl daemon,见 PPerl on CPAN。
重写于 C, 或 C , sorry Java, I mean C#, oops no ...
当然,最后一个“显而易见”的解决方案就是用 native 语言重写您的代码,如 C, C , Java, C# 或者任何当前合适的。

但是这些可能不是实际或策略上可接受的方案。

某些折衷

那么,你能做某些折衷。

XS
您可能发现 5% 的代码使用了 95% 的时间,这些时间 Perl 用来做它低效的工作,如移动位/bit shifting。因此你能用 C 来写那 bit ,用 Perl 写剩下的,最后用 XS 将二者联合起来。但是你需要学习 XS 和 perl API,这是份艰巨的工作。
Inline
或许你能使用 Inline。假如你要操作 Perl 内部,你仍然需要学习 perl API,但是假如你只需要在您的纯 C 代码或他人的 C 库中调用 perl,Inline 让此轻而易举。

如下是我的 perl 程序,它调用了 perl 函数 rot32。而这里是一个 C 函数 rot32 ,它接受两个整数,用第二个整数旋转第一个,然后返回一个整数值。这是你所需的,它能工作得很好。

    #!/usr/local/bin/perl -w

    use strict;

    

    printf "$_:\tX\tX\n", rot32 (0xdead, $_), rot32 (0xbeef, -$_)

      foreach (0..31);

    

    use Inline C => <<'EOC';

    

    unsigned rot32 (unsigned val, int by) {

      if (by >= 0)

        return (val >> by) | (val << (32 - by));

      return (val << -by) | (val >> (32   by));

    }

    EOC

    __END__


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

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