免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5757 | 回复: 10
打印 上一主题 下一主题

[Web] [转贴]CGI, mod_perl, PHP, JSP性能比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-15 13:24 |只看该作者 |倒序浏览
作者: 一网深情


** 请注意! **
测试结果很大程度上依赖于机器的硬件/软件配置,并随配置变化而产生差异,因此:
本测试结果 *仅供参考*

测试用硬件:
CPU: Intel PII 300(66x4.5)
RAM: 192M
HD: IBM 20G(2M cache)

测试用软件:
OS: Slackware 7(自行编译的2.2.14核心)
Web: Apache 1.3.12(标准模块按缺省配置,所有模块静态编译)
PHP 4.0 RC1(加入了MySQL支持)
mod_perl 1.23(缺省配置,未加EVERYTHING=1)
ApacheJServ 1.1(缺省配置)
JDK: JDK 1.2.2
JSDK: JSDK 2
JSP: GNUJSP 1.0.0
JSP: GNUJSP 1.0.0

本测试是用Apache自带的Apache Bench(ab)进行的,命令为:
/www/bin/ab -c 20 -n 1000 CGI/脚本URL
此命令表示使用 20 个并发连接,进行 1000 次请求。
所有测试均在本机进行,各种测试均反复进行5次,去掉最大最小值后取平均值。

我分别测试了C写的CGI、Perl写的CGI、用mod_perl执行的Perl CGI、PHP和JSP。
各种CGI/脚本均输出内容相似的简单页面,内容如下:
html
body
h1The xxxx Hello Program/h1
p
Hello xxxx World!
/body
/html

测试结果(只取了最具代表性的 Requests per second 即每秒处理请求数这一项)

CGI/脚本类型 每秒处理请求数
C CGI 128
Perl CGI 69
mod_perl 223
PHP 237
JSP 21

除了JSP之外,其它几种CGI/脚本的表现大致是正常的。Perl程序解释执行,作为
CGI运行时又需要另外fork进程,所以最慢;mod_perl和PHP都直接在httpd内部运
行脚本,省掉了fork的消耗,所以快了很多;C程序虽然本应最快,但作为CGI 运
行时也是因为fork而使性能大打折扣。

至于JSP...我想这个结果并不具有代表性。毕竟测试用机只有192M内存,用top看
看,一个JAVA就占了11M。况且测试用机本身是一台Web server,测试时还有好几
十个httpd在跑

不过不管怎么说,在配置较低的服务器上,跑PHP、mod_perl在性能上要好过JSP
是肯定的。

附测试用程序:


C程序 hello.c
#include stdio.h

int main(void)
{
char s[] = "C CGI";
printf ("Content-Type: text/html ";

printf ("html "
"body "
"h1The C CGI Hello Program/h1 "
"p "
"Hello %s World! "
"/body "
"/html ", s);
return 0;
}

用 gcc -o hello hello.c 编译,把 hello 放到 cgi-bin目录下。

Perl程序 hello.pl
#!/usr/bin/perl
#!/usr/bin/perl
$s = "erl CGI";
print "Content-Type: text/html ";
print <<DONE
html
body
h1The Perl CGI Hello Program/h1
p
Hello $s World!
/body
/html
DONE

把hello.pl放到cgi-bin目录下,兼作Perl CGI和mod_perl 脚本测试用。

PHP文件 hello.php
html
body
h1The PHP Hello Program/h1
<? $s = "HP"; ?>;
p
Hello <? echo $s ?>; World!
/body
/body
/html

JSP文件 hello.jsp
html
body
h1The JSP Hello Program/h1
p
<% String s = "JSP"; %>;
p
Hello <%= s %>; World!
/body
/html

论坛徽章:
0
2 [报告]
发表于 2003-01-15 13:41 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

跑jsp这么耗内存吗,这和运行什么样的服务器也有关系吧,请问斑竹tomcat,resin哪个性能更好些(同等条件下)

论坛徽章:
0
3 [报告]
发表于 2003-01-15 13:44 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

[quote]原帖由 "shenvo"]跑jsp这么耗内存吗,这和运行什么样的服务器也有关系吧,请问斑竹tomcat,resin哪个性能更好些(同等条件下)[/quote 发表:

我觉得不要钱的好,纯属个人意见,不代表版本意见,呵呵

论坛徽章:
0
4 [报告]
发表于 2003-01-16 13:48 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

我的tomcat比较夸张,环境为redhat AS 2.1+apache1.3.27+tomcat 4.1.18,jdk为IBMJDK1.3.1,数据库为oracle9I,开始时每个java占用内存为25M,随着访问的增加开始上升到100多M,多时达到300多M,没有访问后java占用的内存并不释放,只有重起tomcat才能释放内存,我一直找不到原因,蜘蛛你知道吗?

论坛徽章:
0
5 [报告]
发表于 2003-01-16 13:55 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

[quote]原帖由 "neteagle"]我的tomcat比较夸张,环境为redhat AS 2.1+apache1.3.27+tomcat 4.1.18,jdk为IBMJDK1.3.1,数据库为oracle9I,开始时每个java占用内存为25M,随着访问的增加开始上升到100多M,多时达到..........[/quote 发表:

是你的程序没有释放内存吧???

论坛徽章:
0
6 [报告]
发表于 2003-01-16 14:09 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

对,tomcat没有释放内存,一个java仍然占用300多M内存,
只有重起tomcat才能释放

论坛徽章:
0
7 [报告]
发表于 2003-01-16 14:11 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

原帖由 "neteagle" 发表:
对,tomcat没有释放内存,一个java仍然占用300多M内存,
只有重起tomcat才能释放

我查查资料,我觉得是你程序写的有问题,不是tomcat的问题

论坛徽章:
0
8 [报告]
发表于 2003-01-16 14:16 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

我先用我自己的应用出现问题,
后来用了你上面贴里的那个helloword.jsp
用ab测试

论坛徽章:
0
9 [报告]
发表于 2003-04-03 10:52 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

原帖由 "南非蜘蛛" 发表:
除了JSP之外,其它几种CGI/脚本的表现大致是正常的。Perl程序解释执行,作为
CGI运行时又需要另外fork进程,所以最慢;mod_perl和PHP都直接在httpd内部运
行脚本,省掉了fork的消耗,所以快了很多;C程序虽然本应最快,但作为CGI 运
行时也是因为fork而使性能大打折扣。




simple c cgi should be much more quicker than listed.

forking a perl takes about 4 MB memory while forking a simple c program can be ignored (yes still some overhead).

agree that c cgi should simple.

price for php and mod_perl is that you end up with a much larger httpd file which needs more resources to run - no free lunch as it says.  so the system can be really slow when/before it establishes its httpd process pools, and when there are a lot of users so new httpd processes need to be created.

论坛徽章:
0
10 [报告]
发表于 2003-10-20 01:47 |只看该作者

[转贴]CGI, mod_perl, PHP, JSP性能比较

无意中发现这个帖子,我也测试了一下,和上面的结果完全不同

理论归理论,还是多实测,不同的代码不同的环境可能有不同的测试结果。

我的测试结果完全相反(在windows环境)perl普通状态(没有mod_perl)下不但不慢,还比PHP要快

测试完成相同加法运算,循环1000000次(如果您的机器配置比较底,可以减少循环次数)

雷鸟2000+ 256兆内存,考虑到加上编译时间,做了两个脚本:
######perl.cgi#########
#!/usr/bin/perl  
use Benchmark;  
$TT0 = new Benchmark;  
do "test.cgi";#用DO命令调用test.cgi脚本来计算总时间
exit;  


#######test.cgi########
print "Content-type: text/html\n\n";
$abc=1000;
for ($i=1;$i<1000000;$i++){
$abc=$abc+100;
}
print "运算结果$abc";

$TT1 = new Benchmark;  
$td = Benchmark::timediff($TT1, $TT0);  
$td = Benchmark::timestr($td);  
$td =~ /(\d+)\s*wallclock secs \(\s*?(\d*?\.\d*?)\s*usr\s*\+\s*(\d*?\.\d*?)\s*sys/i;  
my $alltimas=($2+$3)*1000;  
print "<center>;CPU 时间:$2 usr + $3 sys 合计运行时间 $alltimas 毫秒";  

###########然后运行perl.cgi,



php没有类似do命令,要得到编译时间需要到dos窗口:

######此脚本插入到下面的test.php两个脚本中间##############
<?php
$sum = 100;

for($i=0;$i<1000000;$i++){
        $sum += 100;
}
echo $sum;
?>;





######gettime.php########

<?php
list($usec, $sec) = explode(" ",microtime());
echo sprintf("%.8f", ((float)$usec + (float)$sec));
?>;

#########output.php###############
<?php

$fp1 = fopen("first.txt", "r");
$fp2 = fopen("last.txt", "r");

$time1 = trim(fgets($fp1));
$time2 = trim(fgets($fp2));

fclose($fp1);
fclose($fp2);
echo "\n\nTotal time: ";
echo sprintf("%.8f", $time2 - $time1);
echo " second(s)";
?>;
##########test.php#############

########dos窗口执行下面批处理b.bat######

echo Notice: [testfilename] should be with extension
echo         if [testfilename] does not existing,
echo            the default file do.php is used
echo !!! REMEMBER: change the PHP_BIN system variable
echo     to your own directory !!!
echo ------------------------------------------------

pause

set PHP_BIN=c:\php\php.exe

set TESTFILE=%1
if "%TESTFILE%" == "" goto error
if EXIST %TESTFILE% goto ok
goto error
:ok
echo Benchmark: %TESTFILE% ...
goto normal
:default
set TESTFILE=do.php
goto ok
:normal
%PHP_BIN% -f gettime.php >; first.txt
%PHP_BIN% %TESTFILE%
%PHP_BIN% -f gettime.php >; last.txt
%PHP_BIN% -f output.php
goto end
:error
echo No such a file: %TESTFILE%
echo Using default...
goto default
:end

set TESTFILE=
set PHP_BIN=

@echo on

################完################


运算结果:
perl:
运算结果100000900
CPU 时间:0.60 usr + 0.00 sys 合计运行时间 600 毫秒


php:

0.7801044秒(780毫秒)

也可以不用上面那么麻烦,两个都直接在IE下测试,都忽略脚本的编译时间,肉眼观察windows进程管理器图示曲线就很明显, perl站用的cpu也是要少一些。和上面的测试结果相同

#######直接IE窗口运行test.cgi########
#!/usr/bin/perl
print "Content-type: text/html\n\n";
$abc=1000;
for ($i=1;$i<1000000;$i++){
$abc=$abc+100;
}
print "运算结果$abc";

#########直接IE窗口运行test.php##############

<?php
$sum = 100;

for($i=0;$i<1000000;$i++){
        $sum += 100;
}
echo $sum;
?>;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP