|
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] 下一页 |
评论加载中…