返回首页

Perl语言的效率及其他教程

时间:2013-04-25 23:03来源:知行网www.zhixing123.cn 编辑:麦田守望者

上周偶然与fcicq讨论到一个关于perlcc的优化问题。据说用perlcc将perl程序编译成C程序后再用gcc -O3进行优化,速度可能会快一些。于是就测了测,顺便试了试其他语言的情况。

测试程序是Ackermann函数。也许用它来做benchmark不太合适,但毕竟这是个纯数学+多次递归+耗时的运算,也能反映一定问题吧。

 

先来看Perl的原版。

$ cat ack.pl
#!/usr/bin/perl

sub ackermann {
  my ( $m, $n ) = @_;

  return $n + 1 if $m == 0;
  return ackermann( $m - 1, 1 ) if $n == 0;
  return ackermann( $m - 1, ackermann( $m, $n - 1 ) );
}

print ackermann( 3, 10 ), "\n";

$ time ./ack.pl
8189

real    1m5.044s
user    1m4.412s
sys     0m0.620s

结果约为65秒。然后用perlcc编译并gcc -O3优化试试:

$ cp /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/DynaLoader/DynaLoader.a .
$ ar xv DynaLoader.a          # 先弄个必要的DynaLoader.o否则会连接错误
$ perl -c -o ack-perlcc.c ack.pl
$ gcc -O3 -c -o ack-perlcc.o `perl -MExtUtils::Embed -e ccopts` ack-perlcc.c
$ gcc -o ack-perlcc `perl -MExtUtils::Embed -e ldopts` DynaLoader.o ack-perlcc.o
$ time ./ack-perlcc
8189
real    1m3.487s
user    1m3.012s
sys     0m0.484s

用了63秒,跟perl是同一数量级的。可见这个perlcc之后没什么效果。

遗憾之余顺手写了个纯C版本:

$ cat myack.c
#include <stdio.h>

int ackermann(int m, int n);

int main() {
  int result = ackermann(3, 10);
  printf("%d\n", result);
  return 0;
}

int ackermann(int m, int n) {
  if (m == 0) return n+1;
  if (n == 0) return ackermann(m-1, 1);
  return ackermann(m-1, ackermann(m, n-1));
}

$ gcc -O3 -o myack myack.c
$ time ./myack
8189

real    0m0.231s
user    0m0.228s
sys     0m0.004s

哇!0.23秒,比perl语言快了280倍以上。看来谈到效率时果然C语言才是王道。也难怪为什么C程序员的待遇那么高了。

当然这个程序是纯粹的数学运算,发挥不出perl的长处,才会让perl效率如此低吧。

PHP也有同样的问题。还是这个Ackermann函数,用纯PHP写出来的效率很低,但如果将函数写成php extension再调用,效率几乎等同于C语言的效率。于是得出个结论,复杂的算法还是不要用PHP直接实现,而是写成extension吧。

------分隔线----------------------------
标签(Tag):php php教程 php龙8国际平台入口 php5 php源代码 php基础教程 php技巧 php6
------分隔线----------------------------
推荐内容
  • Laravel debug bar 调试利器

    一、简介 Laravel Debugbar 在 Laravel 5 中集成了 PHP Debug Bar ,用于显示调试及错...

  • 如何安装mysql mysql安装图解教程

    本文就是给吊丝程序员介绍的怎么安装mysql的教程一枚,追求高大尚的高帅福可以绕道而...

  • Windows 2008服务器使用Xampps 搭建环境完美整合mod

    一、Xampps Tomcat模块使用中需要jdk支持的安装方法: 由于jdk的包真心大 180MB, 也无...

  • PHP调试利器XDebug的安装与使用基础教程

    很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,虽然对于有较丰富开...

  • phpstorm创建编辑远程项目实现图解教程

    PhpStorm是一个编辑PHP代码的神器,应该说是目前世界上编辑PHP代码的最好用的IDE了吧...

  • PHP的一种实现基于遗传算法的组卷系统的代码

    遗传算法(Genetic Algorithm,简称GA)是一种模拟达尔文的遗传选择和自然淘汰的生物...

  • 猜你感兴趣
  • 教育技术学动态
  • 教育技术学论文
  • 理论研究
  • 应用研究
  • 资源收藏
  • 百家观点
  • 英文文献
  • 中国电化教育
  • 电化教育研究
  • 中国远程教育
  • 开放教育研究
  • 现代教育技术
  • 远程教育杂志
  • 现代远距离教育
  • 中国教育信息化
  • 中国信息技术教育
  • 中小学信息技术
  • Flash龙8国际平台入口
  • Photoshop龙8国际平台入口
  • 3DMAX龙8国际平台入口
  • AutoCAD龙8国际平台入口
  • CorelDRAW龙8国际平台入口
  • Matlab龙8国际平台入口
  • 其他龙8国际平台入口
  • .Net龙8国际平台入口
  • Asp龙8国际平台入口
  • Php龙8国际平台入口
  • Jsp龙8国际平台入口
  • Ajax龙8国际平台入口
  • Android教程
  • 其他龙8国际平台入口
  • Word教程
  • Excel教程
  • PowerPoint教程
  • Ubuntu教程
  • 其他教程
  • 课件下载
  • 软件下载
  • 视频教程下载
  • 其他下载
  • 教案大全
  • 试题大全
  • 课件大全
  • 其他大全
  • 人像摄影
  • 风光摄影