- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编程语言Perl性能优化的三大技总结巧
本文和大家重点讨论一下Perl性能优化技巧,利用Perl开发一些服务应用时,有时会遇到Perl性能或资源占用的问题,可以巧用require装载模块,使用系统函数及XS化模块,自写低开销模块等来优化Perl性能。
Perl性能优化
Perl是强大的语言,是强大的工具,也是一道非常有味道的菜:-)利用很多perl的特性,可以实现一些非常有趣而实用的功能。
利用Perl开发一些服务应用时,有时会遇到Perl性能或资源占用的问题,如何解决呢?以下是自己过去开发实践的一些经验,几个主要的技巧分别是:
◆巧用require装载模块◆使用系统函数及XS化模块◆自写低开销模块◆优化正则表达式◆善用BSDsocket
巧用require装载模块
为避免程序一启动就加载大量模块,降低启动速度,可以在必要的时候再装载模块,这时候就是require 大派用场的时候了。如:
#!/usr/bin/perl-w ?
usepre_load_module; ?
?
#Initializesomething ?
init_args(); ?
?
#if$use_this_moduleistrue,loadtheModule ?
if($use_this_module){ ?
requireModule; ?
} ?
?
上述代码中,如果变量$use_this_module设置了,那么才加载Module,如果没设置则不需要加载,实现了:useondemand的功能。在CGI应用程序中,这相当有用,如果每次请求(fork)都加载大量无用模块的话,响应速度会有所降低,而在特定场合才加载一些模块将加块启动、解析的速度,提高Perl性能。
再看一个例子:
#!/usr/bin/perl ?
my$pid=forkordiecantfork:$!\n; ?
if($pid){ ?
printimfather\n; ?
sleep; ?
}else{ ?
printimchild\n: ?
requireIO::Socket; ?
sleep; ?
} ?
上述代码中,如果在程序一开始就用use来载入IO::Socket模块,那么子/父进程都加载了该模块,通过top命令发现子父进程大小都是3.07MB;如果只在子进程里加载,则只在子进程里有效,内存的消耗将降低,top命令发现子进程3.04MB,父进程变为1.4MB。
使用系统函数及XS化模块
Perl内建的系统函数及用c编写的perlXS扩展模块的速度和效率都比纯perl的实现要好得多。在Perl性能要求较高的场合(如开发ApplicationServer,NetworkServer等),可以考虑使用这些内建函数或XS化模块。
如Socket就比IO::Socket的内存消耗要低,XS编写的Data::Dumper就比纯Perl的Data::Dumper要快4-5倍。此外,一些简单的任务并没必要使用Perl模块,如获得主机IP地址就大可不必载入庞大的Net::DNS而只是使用gethostbyname()系统函数即可。
以下是一些常用的替代方案以获得更快的速度,更好的效率:
◆用sys*系列函数等替代open/seek/tell/等标准IO操作◆用Socket代替IO::Socket以获得更低开销和内存占用◆用get*by*系列函数代替Net::DNS◆用index/substr等代替部分低效正则表达式◆用select(3参数版本)代替IO::Handle部分功能.......
自写低开销模块
通常我们使用一些Perl模块时,只使用了其中很小一部分的功能,可是却不得不载入整个模块,甚至要载入其他不相关的模块。因此往往使整个程序非常臃肿庞大。著名的web管理软件webmin的miniserv(一个简化的http服务端)功能强大,还支持SSL,但资源占用却出奇的少,只有大约5.6MB的大小!这是为什么呢?因为miniserver只使用了2个Perl系统模块(Socket及POSIX),没有载入其他的模块。一些本需要其他perl模块的功能,均由web-lib.pl等用系统函数编写代替。
例如以下是一个获得A记录的高速函数get_mx(),它不依赖任何模块,速度非常快,可以提高Perl性能。
subget_mx{ ?
my@info=gethostbynameshift; ?
my@addr=splice(@info,4); ?
my@rt; ?
foreach(@addr){ ?
push@rt,join(.,unpack(C4,$_)); ?
} ?
\@rt; ?
}?
另一个例子,对于标准的IO::Handle对象,可以使用$obj-autoflush(1);
您可能关注的文档
最近下载
- 浅谈初中物理教学语言严密性.doc VIP
- 高压配电柜日常维护保养方案.docx VIP
- 国考物理化学真题及答案.doc VIP
- 强制氧化-尿素还原法(FO-UR)烟气脱硝成套技术.doc VIP
- 2024年江苏赛区复赛“扬子石化杯”第38届中国化学奥林匹克(初赛)选拔赛暨化学试题含答案.pdf VIP
- 招标代理服务技术方案104页.docx
- 政府采购项目招标代理机构服务投标技术方案(技术标).pptx VIP
- 2025至2030中国建筑信息模型(BIM)行业发展趋势分析与未来投资战略咨询研究报告.docx
- 2024广东建设职业技术学院招聘笔试真题含答案详解.docx VIP
- 公司法中董事对第三人责任的性质界定与归责原则研究.docx VIP
文档评论(0)