|
|
|
|
 perl 脚本循环效率还是比较慢 - jazz [ 2005-04-29 12:28 | 2,476 byte(s)]
 Re: perl 脚本循环效率还是比较慢 - fgh [ 2005-05-18 16:45 | 315 byte(s)]
 Re: perl 脚本循环效率还是比较慢 - ACp [ 2005-04-29 17:52 | 23 byte(s)]
 Re: perl 脚本循环效率还是比较慢 - jazz [ 2005-04-30 02:19 | 1,012 byte(s)]
 Re: perl 脚本循环效率还是比较慢 - hyacinth [ 2005-05-11 20:59 | 491 byte(s)]
 Re: perl 脚本循环效率还是比较慢 - Qiang [ 2005-04-30 10:19 | 564 byte(s)]
 Re: perl 脚本循环效率还是比较慢 - Viperii [ 2005-04-30 09:01 | 89 byte(s)]
 Re: perl 脚本循环效率还是比较慢 - jazz [ 2005-05-01 03:12 | 195 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
简单的循环1百万次,比了一下各种语言的效率,
试了用vb, vb script, c#, perl script, inline C 结果如下
机器配置T42 centrino 1.4G
vb 100ms
vbscript 1370ms
c# 10ms
perlscript 550ms
inline C 1-2ms
perl除了比vbscript要快一些,比其它几种都要慢好多
代码如下:
---------perl----------------------------------------
use Time::HiRes qw(time gettimeofday);
my $msec=time;
my $t=0;
my $cnt=1_000_000;
for(my $i=0;$i<$cnt;$i++)
{
$t=$t+$i;
}
my $msec2=time;
print "loop for $cnt times takes ",($msec2-$msec)*1000,"ms";
--------C#------------------------------------
using System;
using System.Runtime.InteropServices;
class Test
{
[DllImport("kernel32.dll")]
public static extern int GetTickCount();
public static void Main()
{
long t1=GetTickCount();
long a=0;
long num=1000000;
for(int i=0;i<num;i++){
a=a+i;
}
long d=GetTickCount()-t1;
Console.Write("loop for {0:d} times takes {1:d} ms",num,d);
}
}
#-------------------------VBScript ------------------------------------------------------
t1=timer
num=1000000
aa=0
for i=1 to num
aa=aa+i
next
t2=timer-t1
wscript.echo "loop " + cstr(num) + " times takes" & cstr(t2*1000) & " ms"
#-----------------------inline C-----------------------------------------------
use Inline C;
my $cnt=10_000_000; #NOTE! its ten million times
print "loop for $cnt times takes ",test($cnt),"ms";
__END__
__C__
#include <windows.h>
long test(int cnt)
{
DWORD t1=GetTickCount();
DWORD g=0;
int i;
for(i=0;i<cnt;i++){
g+=i;
}
return GetTickCount()-t1;
}
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
我觉得还是蛮有意义,记得曾经作过一个perl下载流文件的cgi--循环的输入缓冲里的数据,后来改用asp的ADO.Stream来写,在局域网中快了好几倍.两个的区别是明显的,就象上述的比较一样,perl是解释执行,而ado.stream或VB编译出的com对象都是本地机器代码.
开发效率是一方面,语言本身的效率也是一个重要方面, 因为一个项目里大多数人不是语言的高手.如果想让自已的程序跑快点,处理数据多点,还是有必要对它有了解的.
虽有perlcc能把perl编译成本地代码或伪代码,但其提高的效率实在不敢恭维. activestate公司有一款perl的编译器,可惜不是免费的,也一直懒得去try.
perl从脚本出身,历史悠久,功能强大广泛,但也有先天的不足--不是强类型的一个语言,以至难于优化编译形成较快的机器代码.
看到C#和C的效率几乎接近,不得不感慨它的编译做的真好.而它比C要强--支持自身反射--更接近脚本或java才有的功能.
但还不是太坏,好在还有perl Inline C/Java.和XS...不算太难学.
最近因为作一些linux上的应用,重新捡回perl,用得一直不多,一点点感受,还要多多指教.
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
你这是win32测试吧,我在Linux kernel 2.6.11/Perl 5.8.4上运行,CPU比你的差,但速度却比你快.
|
|
----
Where is the RED pill? I want OUT!
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
你说的很多都有道理。
语言本身的效率确实是个重要方面。但要看情况来决定我们是否在意。
如果用 perl 来做一个项目花较短的时间 (CPAN etc..),速度要求不是那么高。 那还有什么原因不用 perl 呢?
如果你要求特别的速度,那就把花最多时间的地方用 inline::C 写。
不过很多时候程序速度问题很大方面是程序设计问题, 算法问题。与语言本身实在是没有多大关系。
另外, 如果你的 loop 用 perl 形式的 loop 来写 而不是 C 类,速度会快些 ( perl 会想办法提速 )
for my $i (0..$cnt)
|
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
是的.刚在linux下试了下,确实快点:
kernel 2.6.11.6
perl 5.8.6
c 类型的loop要~400ms
(0..$cnt)类型~320ms
多谢楼上各位指点
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
这样比较没有意义。
传统CGI是没有容器的概念的,每个CGI都是一个新进程。
新的CGI技术(JSP/PHP等)都有容器的概念,这样,容器就大大提高了CGI运行的性能。
ASP based的技术自带了容器,所以当然比标准CGI快,甚至比C写的CGI更快,这也是当年M$把我骗到ASP阵营的原因。
很快我发现我错了,试试mod_perl+apache worker或者fastcgi,重新测试一下性能对比,你就知道了。
当然,这里只提到性能,还不涉及开发和部署的成本,在那些方面perl的优势就更加明显了。
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
用VB及Perl同时编写一个Base64编/解码程序,对一个几百K以上的文件进行编/解码看看谁更快?
象一般的循环什么的,当然Perl会慢一些,但Perl的特点是有大量非常有效地完成各种工作的模块,所以工作起来速度一点都不慢,要写有效的程序要靠你不断地发现。VB也是一样,很多时候也不会比VC慢多少,程序的好赖就看你怎写了。
|
|
|
[Original]
[Print]
[Top]
|
|
|