ASP.NET、PHP、JSP的简单比较

mkkm0 2005-03-13 11:05:26
ASP.NET、PHP、JSP的简单比较

徐峥(bigmodem@gmail.com)


一、前言

网页开发平台比较常用的有ASP.NET、PHP和JSP,常用的数据库有Oracle、MS SQL Server、MySQL,到底如何搭配才能取得最佳效果是开发人员关注的问题,本文在开发成本和性能上对几种搭配作简单比较,希望为小型企业和个人开发网站起到一点抛砖引玉的作用。

二、测试环境

首先介绍一下我使用的测试环境,ASP.NET的运行环境A如下:

操作系统 Windows 2003 Server
CPU K6II-350
内存 256M
硬盘 IBM-DPTA-372050 20G
主板 EPOX MVP3G

这显然是一个老掉牙的PC,但它还是比跑PHP和JSP的PC好一些,运行环境B如下:

操作系统 RedHat Linux 6.2(Kernel 2.2.24-6.2.3)
CPU K6II-350
内存 128M
硬盘 QUANTUM FIREBALL CX10.2A 10G
主板 麒麟 MVP3

可以看出除内存差128M外,两个运行环境硬件差别不大,微软的程序要更耗内存,所以只好多给一些照顾。很多朋友关心的Windows下的PHP和JSP测试我没有完成,因为我一直猜测PHP和JSP在Linux下的表现更为优秀。
数据库也安装在这两台电脑上,Linux下安装了Oracle 8.1.7和MySQL 5.0.1,Windows下安装了SQL Server 2000 SP3。很自然,ASP.NET的合作伙伴是IIS,而PHP的拍档是Apache 2.0.52,JSP容器我选用了Tomcat 5.5.5和Sun JDK 1.4.2。
...全文
1514 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tbraz 2010-06-09
支持第一种。。
回复
sky_kiss 2005-05-31
ding le
回复
syu 2005-05-31
我用PHP5.03+ZEND 编译优化后.结果就发生了变化.
同样的代码.
PHP的执行时间如下:
整数运算测试结果 1.32秒
浮点数运算测试结果 1.09秒
MYSQL两千次 1.82秒

除了MYSQL变化不大.可以忽略外.其它的都长进很大.况且这还是在WIN平台下.我相信在UNIX下应该还有提升.晚上回家再用LINUX测试一下.


另外说一下.用isapi的PHP和jsp及.NET比没什么意义.一个解释型的和两个预编译的能比么?
为什么不把ASP.NET放在LINUX下去比.

PHP的实际性能老实讲和J还差一些.语法也很弱.
但作为快速开发,用在中小型上,真的蛮不错的.
不适合大型开发.
回复
hxz2008 2005-05-31
关注中……
回复
bluekylin 2005-05-31
楼上,vb.net是asp.net的开发工具
回复
javalin3012 2005-05-31
我原来用过ASP.NET + VB.NET以及C#、数据库方面就是ADO.NET + SQLSERVER

现在用JSP+SYBASE、感触最深的就是一般规模的B/S应用用.NET绝对便捷、舒服!
现在用JSP可能要忙活3天的东西用.NET可能半天就轻松搞定!!

感觉.NET是高档傻瓜相机、JAVA就是专业相机(用好用熟了行、但是比较而言极度不方便)!!!
回复
phpsessid 2005-05-22
拿PHP4跟它们比有点不公平咯 呵呵。
拿PHP5+Zend优化引擎比去。。。
回复
hzy111 2005-03-25
文章
回复
wahdee 2005-03-25
好棒~~!
回复
677 2005-03-23
thk
回复
runmin 2005-03-21
不错地文章,感谢
回复
danjingwu 2005-03-19
收藏,等待高手讨论!

我现在想转型,就是不知道往sun还是microsoft,楼主这篇是讨论三者的差别,但比那些只会叫嚣,又不深入剖析利弊的人好太多太多了,有楼主这篇文章,让我对三者的性能有比较全面的认识!如楼主说的,现在就等高手再讨论当多用户并发时是怎么样的?
回复
web_gus 2005-03-18
回复
minghui000 2005-03-18
up
回复
mkkm0 2005-03-13
五、单用户测试结果

单用户测试是模拟系统用户非常少时,比如并发用户只有一个的情况,这时系统有可能达到理论上的最佳性能。

1.整数运算测试结果

平台 执行整数加法次数 平均耗时
ASP.NET 4000000 0.07秒
JSP 4000000 0.08秒
PHP 4000000 39.80秒

2.浮点数运算测试结果

平台 执行浮点数加法次数 平均耗时
ASP.NET 4000000 0.15秒
JSP 4000000 0.207秒
PHP 4000000 36.20秒

3.MySQL测试结果(MyISAM引擎)

平台 插入记录数 平均耗时
PHP 2000 1.93秒
JSP 2000 2.00秒
ASP.NET 2000 3.22秒

4.MySQL测试结果(InnoDB引擎)

平台 插入记录数 平均耗时
JSP 2000 2.26秒
ASP.NET 2000 3.33秒
PHP 2000 10.36秒

5.Oracle测试结果

平台 插入记录数 平均耗时
JSP 2000 6.48秒
PHP 2000 13.35秒
ASP.NET 2000 14.10秒

6.MS SQL Server 2000测试结果

平台 插入记录数 平均耗时
ASP.NET 2000 2.44秒
JSP 2000 2.69秒
PHP 2000 5.04秒

五、单用户测试结果分析

PHP的速度只在连接MyISAM引擎时表现良好,除此之外几乎一无是处,由于PHP是解释执行而且变量无类型,这造成它的数值计算速度非常慢,响应时间是ASP.NET和JSP的数百倍。
千万不要使用PHP进行复杂的数值计算,如果必须要这么做,最好使用PHP的自定义函数功能,用C实现函数后用PHP调用。
ASP.NET在其绝对速度上表现突出,在连接SQL Server 2000时性能优异。但连接Oracle速度很慢,很让人费解,可能是驱动程序没有优化所致,也可能是两个巨头在某些方面没有达成一致意见。
JSP依靠其设计优秀的JDBC在数据库操作上平均速度最快,访问所有的数据库代码都无需修改,在数值计算能力上和ASP.NET的差别几乎可以忽略不计,从这一点上来看,J2EE在企业中的地位很难动摇,何况在其背后还有这么多业界巨头和自由开发者。

七、最后的优胜者

本文推荐几个黄金组合,按使用成本从低到高如下:

Linux + Apache + PHP + MySQL(MyISAM引擎)
这个组合在性价比上是当之无愧的王者,因为它的所有软件均免费而且拥有最快的数据库响应时间(1.93秒),相当稳定,很少有人听说MySQL死机吧?这个组合入门很容易,这也是为什么那么多初学者选用LAMP来做个人主页的原因了。LAMP的缺点是事务处理能力弱,数值计算能力差,很不适合企业级计算,但对经常读写数据库,又不需要事务处理的应用,比如论坛、办公网、企业门户网站等,它还是很胜任的。LAMP的入门要求是您必须有一名Linux系统管理员。

Windows 2003 + IIS + ASP.NET + SQL Server 2000
这个组合在开发成本上应该是最低的,因为它拥有最为强大的桌面集成环境,而且这套软件微软打包后价格不贵,支持的功能又特别多,特别适合中小型企业构造企业网站、办公网、电子商务平台等。这个组合的最大风险来自Windows的病毒引起的维护成本,因为攻击Windows的病毒实在太多,Windows系统的用户必须相当小心才能使自己的平台不受攻击。如果一个企业的拥有1到2名微软认证的系统管理员,而且所有Windows都是正版,推荐使用这套配置。

Linux(Unix) + Apache + Tomcat(Jboss) + Oracle 10g
这个组合是专为中到大型企业信息系统准备的,Oracle虽然对硬件要求较高但非常适海量数据的存储,现在Oracle 10g安装、配置、维护都很容易,Linux的使用也使Oracle成本大大下降。使用JBoss的主要原因是因为它免费,当然有钱也可以用Weblogic。大型企业中往往存在多个不同数据库,分别存储不同用途的数据,使用J2EE对其进行整合非常合适,可以很容易通过服务器群集实现性能扩充,及时满足企业客户群不断增加,市场不断扩大的情况。这个组合的弱点是开发费用比较高,尤其是牵涉到J2EE的一些既高级又不太成熟的功能时,而且JDK的垃圾回收器一直做得不如.NET,在内存占用和CPU占用上都很吓人。使用这个方案的企业必须有充裕的资金,长远的信息系统战略,并且最好有自己的开发团队。


八、后记

忙了一天,终于写完了这篇小文,还有很多问题没有研究,比如在用户不断增加的情况下的并发性能和资源消耗问题,非常愿意和朋友们一起研究交流。
需要完整的源代码的朋友可以发邮件给我,我的邮件地址为bigmodem@gmail.com。


徐峥 2005年3月13日
回复
mkkm0 2005-03-13
2.建立PHP测试环境

PHP的测试环境建立在Linux + Apache上,加上MySQL就是大家熟知的“LAMP”,也许自由软件真的是盏明灯,在这个功利至上的世界引导我们走向光明。下载了Apache 2.0.52和PHP 4.3.10的源代码后,编译、安装和配置都很顺利,开发PHP可用的集成环境也不少,最好的可能是Zend Studio,整个程序用Java开发,可以跨平台,但速度比较慢。
为了访问MySQL、Oracle和MS SQL Server,还必须在Linux上安装这些数据库的客户端,SQL Server 2000没有官方的Linux客户端,但可以使用一个叫FreeTDS的第三方产品连接SQL Server。
费了一番周折后,终于可以使用PHP进行测试了,下面是用PHP进行整数计算的测试代码:

$debug = new Debug;
$debug->startTimer();
$count = intval( $loopCount );
for( $j = intval( 0 ); $j < $count; $j ++ )
{
$result = intval( 0 );
for( $i = intval( 0 ); $i < $count; $i ++ )
{
$result += $i;
}
}

$totalTime = $debug->endTimer();

代码量似乎比C#还小,但为了计算运行时间我不得不使用了一个Debug类,PHP提供的功能显然没有.NET丰富,下面是Debug类的代码:

class Debug
{
function startTimer()
{
global $starttime;
$mtime = microtime ();
$mtime = explode (' ', $mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;
}
function endTimer()
{
global $starttime;
$mtime = microtime ();
$mtime = explode (' ', $mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = round (($endtime - $starttime), 5);
return $totaltime;
}
}

PHP4只支持有限的面向对象功能,与微软.NET的技术先进无法相比,但PHP是这三种开发平台中最简单易学的。下面是PHP4访问SQL Server 2000的代码:

$debug = new Debug;
$debug->startTimer();

mt_srand( make_seed() );
$owner = mt_rand();

$count = intval( $sqlNumber );
$result = intval( 0 );

$conn = @mssql_connect( 'fly', 'simon', '123456' );

for( $i = intval( 0 ); $i < $count; $i ++ )
{
$sql = "insert into fortest values ( $owner, $i," +
"'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' )";
mssql_query( $sql );
}

$sql = "delete from fortest where ownerid = $owner";
mssql_query( $sql );

$totalTime = $debug->endTimer();

echo "<h2>Micosoft SQL Server</h2><br>\n";
echo "<h3>完成了".$sqlNumber."次insert操作。</h3><br>\n";
echo "<h3>共耗时".$totalTime."秒!</h3>\n";

FreeTDS对SQL Server 2000事务支持的不好,提供的数据库函数中没有事务功能,只好使用最基本的操作。PHP4的另一个缺点是连接Oracle和MySQL时代码差别很大,完全依赖于数据库的底层接口,这样数据提取性能虽然有所体提高,但修改程序比较麻烦。

3.建立JSP测试环境

由于Sun为JSP制订了详细的规范,所以满足JSP规范的容器很多,此外JDK也有很多版本,我选用了相对最为简单、用户比较多的Tomcat 5.5.5作为JSP容器,JDK选用了1.4.2。为了调试程序方便,又在笔记本电脑上安装了著名的eclipse 3.0和lmboz 3.0,先在笔记本上开发,然后再发布到Linux上测试。
Eclipse的配置比较繁琐,尤其是和lmboz搭配使用时,很多细节不注意就不能达到预期目的,比如我为了在eclipse下实现JSP单步调试,足足折腾了两天,现在可以了还是不明白为什么可以。
总体感觉在eclipse下开发JSP还是挺爽的,但是机器配置要高,lvmboz有时行为很怪异,多试几次才能解决问题。
下面是测试JSP整数性能的代码:

class Debug
{
private long startMs;

public void startTimer()
{
startMs = new java.util.Date().getTime();
}

public double endTimer()
{
return ( new java.util.Date().getTime() - startMs ) / 1000.0;
}
};

Debug db = new Debug();
db.startTimer();


int count = Integer.parseInt( request.getParameter( "loopCount" ) );
int result = 0;

for( int j = 0; j < count; j ++ )
{
result = 0;
for( int i = 0; i < count; i ++ )
{
result += i;
}
}

double totalTime = db.endTimer();

out.print( "<h2>Java</h2><br>\n" );
out.print( "<h3>一共完成了" + count*count + "次整数加法。</h3><br>\n" );
out.print( "<h3>运算结果是" + count + "个" + result+ "<h3><br>\n" );
out.print( "<h3>共耗时" + totalTime + "秒!</h3>" );

总体感觉Java代码比PHP要好些,但相对C#还是略显繁琐。为了测试数据库性能,分别从Oracle、Microsoft、MySQL官方网站下载了最新的JDBC驱动,所有JDBC驱动都是直接访问数据库而不依赖数据库客户端,下面是JSP访问Oracle的代码,其他数据库测试代码与此类似。

Debug db = new Debug();
db.startTimer();

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

String server ="jdbc:oracle:thin:@10.1.1.9:1521:testdb";
String user = "test";
String password = "test";


int owner = ( int )( 20000000 * Math.random());

Connection conn= DriverManager.getConnection( server, user, password );
conn.setAutoCommit( false );

int count = Integer.parseInt( request.getParameter( "sqlNumber" ) );
String sql = "insert into fortest values( ?, ?," +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' )";
PreparedStatement pstmt = conn.prepareStatement( sql );

for( int i = 0; i < count; i ++ )
{
pstmt.setInt( 1, owner );
pstmt.setInt( 2, i );
pstmt.execute();
}

conn.commit();
pstmt.close();

PreparedStatement stmt = conn.prepareStatement( "delete from fortest where ownerid = ?" );
stmt.setInt( 1, owner );
stmt.execute();
conn.commit();

stmt.close();
conn.close();

double insertTime = db.endTimer();

out.print( "<h2>Oracle</h2><br>" );
out.print( "<h3>完成了" + count + "次insert操作。</h3><br>" );
out.print( "<h3>共耗时" + insertTime + "秒!</h3>" );

JDBC的数据库操作代码相当一致,而且都提供了事务支持,没费什么劲儿就调通了所有数据库测试程序,几乎是数据库编程中最容易的。

4.开发环境易用度分析

总体来看,微软提供了最好的桌面开发环境,VS2003不仅功能强大而且速度很快,特别是当用户使用的数据库是SQL Server时,优点更为突出,比如可以调试SQL。VS2003的使用和Windows的配置密切相关,有时会相当复杂,但文档和联机帮助很丰富。
Eclispse和lvmboz的组合开发JSP感觉良好,虽然开始配置比较复杂。lvmboz安装时需要注意很多细节,相关文档比较缺乏。
PHP下的集成开发环境Zend Studio速度比较慢,功能简单,安装和配置都比较容易,但文档最少。
从语言使用情况来看,C#最为简洁,Java也很好,PHP相对较差。
优胜者当然是VS 2003,Eclipse也不错。
回复
mkkm0 2005-03-13
三、测试目标和方法

测试目标:

1. 配置和修改程序的难易度。
2. 运算速度(整型、浮点)。
3. 数据库操作IO性能。

测试方法:

1. 用完成这些小程序的过程来估计开发和部署成本。
2. 用完成若干万次浮点或整数加法的时间来说明运算性能。
3. 用插入1000条记录然后删除的时间来说明数据库性能。

四、编写测试代码

1.ASP.NET测试代码

首先使用的是ASP.NET环境,VS.NET 2003作为开发工具已经安装在我的笔记本电脑上,在制作测试项目时,选用了C#作为开发语言,使用ADO.NET进行数据库操作。VS2003环境非常好用,可惜调试出了问题,系统总报错“无法开始调试,Microsoft Ineternet Explorer无法找到”,幸好程序简单不调试也可以。接着是一些讨厌的权限问题又影响了工作进度,在正确的目录设置了权限后,程序终于可以运行了。

下面为整数测试的部分代码:

DateTime startTime = DateTime.Now;
int addCount = int.Parse( Request.Form[ "loopCount" ] );
int result = 0;

for( int i = 0; i < addCount; i ++ )
{
result = 0;
for( int j = 0; j < addCount; j ++ )
result += j;
}

TimeSpan timeSpent = DateTime.Now - startTime;

以上代码用一个两重循环来计算整数加法,浮点数的加法测试程序与此类似。C#语言直观清晰,微软的.NET环境功能很强,很多东西可直接调用,比如计算时间差就非常简单,然后测试数据库性能,由于微软.NET中不包含对MySQL的直接支持,从www.mysql.com下载了最新的ADO.Net Driver for MySQL,测试MySQL性能的代码如下:

DateTime startTime = DateTime.Now;

int insertCount = int.Parse( Request.Form[ "sqlNumber" ] );
Random ownerGen = new Random( (int)DateTime.Now.Ticks );
int ownerid = ownerGen.Next( int.MaxValue );

MySqlConnection conn =
new MySqlConnection
(
"database=test;server=10.1.1.9;ct Timeout=30;user id=test; pwd=test"
);
conn.Open();

MySqlTransaction testTrans;
testTrans = conn.BeginTransaction( IsolationLevel.ReadCommitted );

MySqlCommand cmd = conn.CreateCommand();

for( int i = 0; i < insertCount; i ++ )
{
cmd.CommandText =
"insert into fortest values ( " + ownerid.ToString() +", " + i.ToString() +
", 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' )";
cmd.ExecuteNonQuery();
}
testTrans.Commit();

cmd.CommandText = "delete from fortest where ownerid = " + owenerid.ToString();
cmd.ExecuteNonQuery();
cmd.Dispose();

conn.Close();

为了测试事务处理并加快插入速度,以上代码程序将2000个插入操作放在了一个事务中,测试表用如下SQL创建:

create table FORTEST
(
OWNERID INTEGER not null,
SERIALNUMBER INTEGER not null,
DATA VARCHAR(200)
)
alter table FORTEST
add primary key (OWNERID, SERIALNUMBER)

插入时ownerid随机产生,以便测试并发性能。由于MySQL可以支持多种数据引擎,所以对两种比较常用的引擎MyISAM和InnoDB都作了测试。
微软.NET包含了SQL Server 2000的ADO.NET驱动和Oracle驱动,但测试Oracle时没有使用微软驱动而使用了Oracle自己的版本为9.2.0.4的ADO.NET驱动,因为微软的驱动略显陈旧。SQL Server和Oracle 测试代码除了conn与cmd两个变量使用的数据类型不同外,其他代码与此完全相同,ADO.NET代码在不同数据库间有很好的可移植性。由于数据类型差异,Oracle、SQL Server 2000与MySQL的建表SQL略有不同。
回复
发帖
其他
创建于2007-09-28

1.0w+

社区成员

Web 开发 其他
申请成为版主
帖子事件
创建了帖子
2005-03-13 11:05
社区公告
暂无公告