ASP.NET vs. PHP,哪个更快?

  • 赵劼

2009 年 9 月 15 日

话题:.NETPHP语言 & 开发架构

上个月Joe Stagner在博客上发表了一系列文章比较了 PHP 和 ASP.NET 的执行性能,引起了来自双方程序员的大量回应。Joe 表示,他会将这样的测试持续下去,并寻求更为合适的方式,以获得对实际项目来说尽可能有参考价值的结论。

Joe 表示:

一般来说,作性能测试的目的是要尝试证明一方比令一方要快。我受雇于微软,同时编写 PHP 和 ASP.NET 代码。我在.NET 出现之前就在使用 PHP,两个东西我都很喜欢。

所以,我很难说出哪个更好。当我说 PHP 好话时,我的微软同事们会写信来批评我,而当我发表倾向于 ASP.NET 的言论时,我的 PHP 朋友们会说我是微软的托。

我进行这个测试是因为每个人都对 PHP 的性能有自己的看法(Windows vs. Linux & 5.2 vs. 5.3),却没人能给出明确的数据。

根据 Joe 的描述,测试环境如下:

  • 所有的测试都在同一台机器上运行(拥有 4G 内存和 60G 7200 转硬盘的 Toshiba Tecra M5)。
  • Ubuntu 9 和 Windows Server 2008 标准版分别安装于独立(但相同)的硬盘中。
  • Linux 使用 Apache2,Windows 使用 IIS 7 作为各自的 Web 服务器。
  • 双方的操作系统都进行了完整的 patch 或升级。
  • 双方的系统和运行时都没有进行额外的性能增强。

实验结果上看,PHP 在 Linux 和 Windows 的执行性能各有千秋:

  • 纯粹的语句执行在 Windows 上表现更好。
  • 函数调用在 Windows 上更快。
  • 对象的创建和访问,对于 PHP 5.2 来说在 Linux 上更快,但是对于 PHP 5.3 来说则是 Windows 更快。
  • 类库调用在 Linux 上快得多(如在 Ubuntu 上进行加密要比 Windows 要快 3 到 5 倍)。
  • 在 Linux 上访问文件性能略高于 Windows,不过 Windows 上文件复制的性能要比 Linux 慢 60%,可能是 ACL 高级安全的缘故。
  • 在 Linux 上访问 MySQL 要比 Windows 快不少,而且在 Windows 上运行 PHP 5.3 的情况则更为恶劣(不过从下面 PostgreSQL 的情况上来看,这应该是糟糕实现的缘故)。
  • PostgreSQL 在两个平台上的性能非常接近(1000 个操作的差距在 0.06 秒之内)——无论是 PHP 5.3 还是 PHP 5.2,Windows 上表现都略胜一筹。
  • Windows 上 PHP 5.2 访问 MS SQL Server 的性能稍逊于在 Linux 上访问 MySQL(此时还没有面向 PHP 5.3 的 SQL Server 支持)。

Joe 认为,这表示:

  • 我们可以这么认为,对于纯粹的 PHP 执行性能来说,Linux 和 Windows 相差无几,这不会成为选择 Linux 或 Windows 作为部署平台的决定性因素。
  • 如果你在构建一个应用程序,那么 PostgreSQL 可能是更好的选择。因为它在两个平台上的表现都很优秀。
  • 如果你的应用程序必须使用 MySQL,那么选择 Windows 就需要早些计划扩展性问题了(个人认为 Sun 不太可能为 Windows 优化 MySQL 的性能)。
  • PHP 的第一个版本的 SQL Server 驱动程序要比 MySQL 或 PostpreSQL 要慢一些,但这应该不会成为问题。第二个版本的驱动器正在开发之中,它会带来性能提升。

在 Joe 看来,全面来看,PHP 和 IIS 团队在执行性能上已经做的非常成功,接下来就需要各开源程序的团队(Drupal、WordPress、Joomla 等等)为各平台进行性能优化了。

不过,除了文件复制操作之外,ASP.NET 在性能方面全面领先于 PHP(无论部署在 Linux 还是 Windows 上面):

  • Linux 上访问 MySQL 的性能稍稍优于 Windows 上访问 SQL Server 的性能(使用普通的数据类型和 SELECT 语句)。但是这里的差距几乎可以忽略不计。
  • ASP.NET(C#)操作,如对象使用,类库调用等等,其性能都远高于 PHP。

对于这个测试结果,Joe 补充道:

我知道我的一些 PHP 朋友和 Linux 伙计们要跳出来驳斥我的测试和结果了。:)

我一直在思考,这样的性能比较是否需要加入一些高级的优化选项。不过.NET 方面也有例如多线程,异步请求,和各种缓存方式可以使用

请注意——我并没有说“ASP.NET 更快,所以你不应该使用 PHP!”,我使用认为,PHP 过于简单导致对某些高级应用来说有些举步维艰,就像 ASP.NET 在项目早期会有学习方面的复杂性。

对我来说,PHP 最令人兴奋的地方不是它的语言 / 平台,而是成千上万聪明的 PHP 开发人员,以及各种优秀的项目(如 Drupal、Joomla、WordPress、PHPBB、Nuke 等等)。

可以这么认为,PHP 在 Windows 和 Linux 上的性能处于同一个水平上,我现在终于可以为 Windows 编写那些我盼望着许多年的 PHP 类库了。

Joe 还公开了测试代码。他表示,如果你对这个测试的结果有疑义,可以亲自进行这个实验,或是编写你自己的测试代码进行试验。

文章发布之后,许多网友对这一测试结果发表了看法。Joe 基本上逐一回复了其中的主要观点

“我使用 ASP.NET 只是因为我喜欢 Visual Studio IDE”——我个人认为 Visual Studio 是最有生产力的开发工具。但是,PHP 的有不错的选择。我使用 Zend Studio,PHPEd,Komodo,Delphi for PHP,这些都很不错。我讨厌 Eclipse,不过 Zend 也在这方面为 PHP 开发做了不少扩展。

应该比较 ASP 的性能——不用了,谢谢。旧式的 ASP 与目前的 PHP 与 ASP.NET 差距太大了。做这种比较,似乎是在建议使用 ASP 开发新项目,我强烈不建议你这么做。

32 位与 64 位系统之间的比较——这些测试的目的并不是为了体现 64 位系统上的性能差距。今后的测试我会增加 64 位的场景。

“PHP 丑陋至极”——哦,我不同意。旧式 ASP 要丑陋多了。你可以写出非常可怕而丑陋的 PHP 代码,也可以写出丑陋而可怕的 C# 或 VB 代码。同样,你也可以写出优雅的 C++ 样式的 PHP。这完全只和开发人员的技能有关。

应该使用 Windows 上的 Apache 进行测试——Apache 是 Linux 上的服务器,不过我认为如果你在 Windows 上不使用 IIS 7 则会损失太多太多东西了。

“有办法在 Win2K8 中,在不损失安全性的前提下加快文件复制性能吗?”——似乎不行。我认为这涉及到 Windows 服务器上的 ACL 系统。我以后可能会测试通过数据流读取文件的性能,有些东西的性能可能会有所改善。不过,Web 应用程序一般不会编程来复制大量文件。

“PHP 一直是,也永远只是一个半专业性质的环境”——这种说法狗屁不通。PHP 平台上有许多专业的,高质量的应用程序,也有很多我非常尊敬的开发人员。是否专业是开发人员的问题,不是 PHP 或 ASP.NET 的问题。

“我认为比较没有 opcode 缓存的 PHP 很不公平,.NET 是编译执行的,而 PHP 需要每次都解释并‘编译’页面”——我同意这个测试可能不够完整,但是我不认同这个逻辑。我测试 PHP 的方式,就和下载安装的方式一样。我的虚拟主机也没有安装 op-code 缓存。而事实上,ASP.NET 自带这个特性也并不意味着测试是不公平的,这是因为 PHP 缺少这个特性——不过这个要求很合理,我正在准备新的测试。

“说 PHP 不是一个‘专业的’语言很没道理,因为几乎所有最大的站点都是用 PHP 构建的”——这种说法是没道理,不过说那些站点“几乎都是”用 PHP 构建的也是错误的。有些是,有些不是。

Joe 补充道:

如果你们看到这一数据之后对 ASP.NET 信心倍增我自然很高兴。如果我不认为.NET 是开发 Web 应用程序来说是一种更好的选择——至少不属于其它平台,那么我也不会在微软工作了。

但是……如果你因为这些数据而忽视 PHP,也是错误且幼稚的行为。

从纯技术角度来说,我认为.NET 远比 PHP 强大,但这并不意味着 PHP 不够强大。在我看来,PHP 的力量体现在众多的应用程序以及可用的框架。

大约一周以后,Joe 公开了第二次测试的结果。与前一个测试相比,第二个测试主要有以下两个改变:

  1. 为 Linux 和 Windows 上安装了 op-code 缓存,并重新运行了大部分测试。
  2. 由于一些依赖项的问题,PHP 5.3 + APC 的测试平台变成了 Debain 5 操作系统。

对于第二次测试及其结果,Joe 解释到:

从结果上看,Ubuntu 和 Debian 上运行 PHP 的性能差距可以忽略不计。部分条目的性能有些细小的改进,有些则有 25% 的提高,但是总体来说其效果比我想象中要来得低。

使用 APC 之后,一些条目的运行反而变慢了,不过我认为这只是机器所造成的误差。请注意,表格中显示的不是第一次的结果,都是经过两次刷新,确认是在缓存命中时得到的结果。

我认为现在的测试非常公平。

空的循环测试和空的函数执行非常重要,因为这反映了语言或平台的基础消耗。这是处页面传输等性能开销外的性能消耗,是一个重要的考虑方面。

我的一些 PHP 朋友也认可这个测试的准确性,不过给出了非常有见解的补充:

  • ASP.NET 在性能上的领先不会对我有什么影响。PHP 是我的最爱,我的应用程序已经足够快了。
  • 没错,ASP.NET 在基础性能上是比较快,但是我的应用程序可以通过优秀的页面实现和 JavaScript 实践把这部分性能补回来。
  • 我在进行 Drupal 开发,我对 PHP 最熟悉,因此我宁愿多花一些硬件来保持更好的开发效率。

这些都是很不错的评论!

此外,根据上一次实验的结果,在 Windows 平台上运行 PHP 时,在 MySQL 和文件的访问上有一些性能问题,微软许多团队都向我获取了相关信息。希望这些数据都够转变为切实的改进。

Joe 表示,他将收集大家认为更公平,更有意义的测试场景。以下是他所计划的测试项目:

  • 实际页面测试:循环,寒暑调用和对象操作是一类测试,不过页面的整体呈现则是另一种有意义的测试。
  • 负载测试:哪一个环境可以同时处理更大量的请求。
  • 在负载测试中,哪一方的性能会下降地更快。
  • 在各种情况下,64 位平台的表现如何。

国内也曾经进行过 PHP 在 Linux 和 Windows 平台上的性能测试。InfoQ 曾经报道过微软在 WordCamp China 2009 大会上公开了之前与康盛创想合作进行的性能评估结果:在 Windows Server 2008 + IIS 上运行 PHP,从平均相应时间,每秒处理的请求数,以及数据吞吐量等多方便均优于 Linux + Apache 的托管方式。

您的看法如何?您希望看到什么样的测试呢?

.NETPHP语言 & 开发架构