代码执行速度:ASP.NET-MVC与PHP的比较

75

我和我的同事就这个问题一直在友好争辩,我个人认为使用ASP.NET-MVC编译的Web应用程序比用PHP编写的相同项目运行更高效/更快。但我的朋友不同意。

不幸的是,我没有任何可用于支持我的观点的实证数据。(他也没有)

对此,我尝试谷歌答案以找到证据来证明他错了,但大多数情况下,辩论都转向了哪个平台更适合开发、成本、安全功能等方面... 为了这个争论,我真的不在乎这些东西。

我想知道stackoverflow社区对于使用ASP.NET与MVC开发与使用PHP完全相同的网站的原始速度/效率有何看法?

有人有现实场景下比较两种技术性能的实际例子吗?

(我意识到对于你们中的一些人来说,这可能是一个无关紧要甚至愚蠢的争论,但这是一场争论,我仍然想听听S.O.的优秀人才的回答。)


38
如果你不知道,StackOverflow 是建立在 ASP.NET MVC 上的。因此,这是一个使用 ASP.NET MVC 的优秀项目的绝佳示例。 - Umair Khan Jadoon
源代码在哪里? - mercury
@HossamMaher 如果你一直在关注Jeff Atwood的播客,那么这是一个众所周知的事实。但是这里有一个链接:https://stackoverflow.blog/2008/09/21/what-was-stack-overflow-built-with/ - 7wp
11个回答

72

由于各自堆栈的差异,很难进行比较,因为您最终会以不同的方式完成相同的操作,如果出于比较目的而使用相同的方法,则测试结果并不是非常现实。

我喜欢的PHP,最基本的形式是在每个请求中加载、解释,然后丢弃。在这方面,它非常类似于CGI(这并不奇怪,因为它大约有15年的历史)。

随着时间的推移,已经进行了各种优化以改善性能,尤其是使用APC进行opcode缓存,例如(这样,APC将成为PHP 6的标准部分,而不像现在一样是可选模块)。

但是,PHP脚本仍然基本上是瞬态的。会话信息是(通常)基于文件的,并且是互斥的(session_start()阻止其他脚本访问同一用户会话,直到session_commit()或脚本完成),而在ASP.NET中并非如此。除了会话数据之外,在ASP.NET(或Java)中通常很容易拥有在应用程序上下文中存在的对象(与此类似的是ASP.NET更类似于Java)。

这是一个关键的区别。例如,使用mysql,mysqli,PDO等,在PHP中访问数据库是瞬态的(除了持久连接),而.NET/Java几乎总是使用持久连接池,并在此基础上创建ORM框架等,其缓存超出任何特定请求。

作为一个字节码解释平台,理论上ASP.NET更快,但PHP所能做的限制如此之高以至于对于大多数人来说不相关。例如,全球前20个最受欢迎的网站中有4个是PHP。当您开始扩展时,开发速度、鲁棒性、运行环境的成本等往往比任何理论上的速度差异更为重要。

请注意,.Net拥有原始类型、类型安全以及这些能使代码比PHP更快运行的功能。如果您想进行一些不太公平的测试,在两个平台上对100万个随机的64位整数数组进行排序。ASP.NET将表现出色,因为它们是原始类型,并且简单的数组比PHP的关联数组更有效率(PHP中的所有数组最终都是关联数组)。此外,在32位操作系统上的PHP没有本地的64位整数,所以会因此而受到巨大的影响。
还应该指出,ASP.NET是预编译的,而PHP是即时解释的(除了操作码缓存),这可能会有所不同,但在这方面PHP的灵活性是一个好事情。能够在不重启服务器的情况下部署脚本是很棒的。只需将其放入其中就可以工作。太棒了。但它的性能最终会比较低。
尽管如此,我认为你正在争论一些不相关的细节。

6
作为一个字节码解释平台,ASP.NET与Java或.NET没有任何解释上的关系。它有两个编译阶段:第一阶段将源代码编译成字节码/IL,第二阶段将字节码/IL编译成本地代码。最终只有本地代码被执行。 - Andrei Rînea
12
非常出色而且有深度的比较。但我必须指出一点:"...在这方面上PHP的灵活性是一件好事,能够在不重启服务器的情况下部署脚本很棒。" ASP.NET并不需要重启服务器来发布代码更改。 - Tion
7
在这个回复中所做的所有比较都是关于PHP和.NET(Web Forms)的。对此我可以说,在真实世界和实际场景中,PHP比.NET更快... 这也是我转向MVC的原因... 我仍然希望看到一些关于PHP vs .NET MVC的比较。 - Nestor
1
. NET Core的更新,请查看此 链接 和此 链接,它说.NET Core比PHP更快,这是真的吗? - Shaiju T
@stom ASP.NET是编译代码。不是“字节码”解释,而是通过优化编译器编译为本地代码。PHP是解释脚本。虽然有一些优化可以帮助提高性能,但它仍然不是编译代码。就原始性能基准而言,是的,.NET比PHP更快。 - Craig Tullis
显示剩余2条评论

33

ASP.NET更快,ASP.NET开发更快。如果您做严肃的商业Web应用程序,购买快速计算机并享受它。

相比于PHP,在发布模式下构建、优化、缓存等方面,ASP.NET代码执行更快。但是,对于网站(除了像Facebook这样的大型玩家),这就不那么重要了——页面呈现时间的大部分时间用于访问和查询数据库。

在连接数据库方面,ASP.NET要好得多——在ASP.NET中,我们通常使用LINQ将对象查询转换为SQL Server数据库中的存储过程。此外,与数据库的连接是持久的,一个网站只有一个连接,无需重新连接。

相比之下,PHP无法在请求之间保持SQL Server连接,它连接,获取来自数据库的数据,然后销毁,当重新连接时,数据库通常占页面呈现时间的20-30%。

此外,整个Web应用程序配置在php上的每个请求都会重新加载,而在ASP.NET中,则会持久保存在内存中。这可以很容易地在像Symfony/Symfony2这样的大型企业框架中看到,很多渲染时间都是Symfony的内部进程,而ASP.NET仅加载一次,不会浪费您的服务器进行无用的工作。

ASP.NET可以在应用程序内存中缓存对象,而在PHP中,则必须将其写入文件或使用像memcache这样的黑客工具。使用memcache需要处理并发和危险问题(在文件中存储缓存也会有自己的并发问题——每个请求都启动Apache服务器的新线程,并且许多请求可以同时工作——您必须考虑这些线程之间的并发性,这需要大量的开发时间,并且并不总是有效,因为php语言中没有任何互斥机制,因此无法以任何方式创建关键部分)。

现在来谈谈开发速度:

ASP.NET有两个主要的框架(Webforms和MVC),与环境一起安装,而在PHP中,您必须获取开源框架。PHP中没有像ASP.NET那样的标准框架。

ASP.NET语言非常丰富,标准库中拥有解决很多常见问题的解决方案,而PHP标准库则......空荡荡的......他们无法保持统一的命名约定。

.NET拥有类型,而PHP是动态的,这意味着在运行或编写单元测试之前没有对源代码的控制。

.NET拥有出色的IDE,而PHP IDE的水平一般或者一般好(PHPStorm甚至不如VS+resharper或不使用它)

Symfony的PHP脚手架从命令行启动,而ASP.NET脚手架则集成到环境中。

如果你像我一样电脑慢(单核2.2ghz),开发asp.net页面可能会很痛苦,因为每次更改源代码都需要重新编译项目,而PHP代码会立即刷新。

与C#语法相比,PHP语言语法不完整、不稳定和裸露。 C#强类型和许多灵活的语言特性可以加速你的开发并使你的代码更少出错。


4
LINQ比普通的foreach/if更加强大,这取决于LINQ提供程序的实现。例如,可以查看Entity Framework。一个简单的封装DAO没有类型检查的查询,可能会存在SQL注入问题,因为开发人员错过了早上的咖啡时间,我认为这并不是一种更清洁的方式,相反地则是相反的情况。 - Luis
@Luis,毫无疑问,像任何ORM一样,LINQ to SQL在大多数情况下都会增加相当大的开销,并对性能产生负面影响。StackOverflow就是一个例子,他们使用了很多LINQ,但由于性能原因,他们撤回了很多LINQ并用自己的微型ORM进行替换。 - Craig Tullis
@Craig 当你谈论LINQ时,你需要指定底层的ORM或DAO引擎,一些微型ORM具有LINQ提供程序。我个人不喜欢EF,更喜欢像SQL Fu或ORMlite这样的微型ORM(如果它们允许类型检查查询),但这与性能无关,而是与透明度和可读性有关。 - Luis
@Luis 我认为问题不在于LINQ,而是大多数ORMS的本质。因此,在LINQ2SQL的情况下,瓶颈实际上是企业框架。LINQ本身通常表现良好到出色。一旦微软将扩展方法引入C#(感谢Objective-C!),它就成为了下一个超级明显的演进。 - Craig Tullis
整个回答都充满了错误的事实,PHP确实有持久连接,由于opcaching和配置在每次请求时被加载,PHP不会在每个请求上重新加载。在每个请求上加载配置是symfony的特性而非PHP的特性。我不能相信这样不准确的信息竟然有这么多点赞,唯一比你的完全错误的“事实”更糟糕的就是你的英语水平。 - twigg
显示剩余3条评论

23

根据我(非硬性基准测试)的经验,Asp.Net在原始速度方面肯定可以与PHP竞争(在某些方面甚至超越),但与许多其他语言选择相关的问题类似,在这种情况下,以下语句是有效的(依照我的意见):

  • 使用语言X(无论是PHP还是Asp.Net)会有缓慢、有缺陷的网站。
  • 使用语言X(无论是PHP还是Asp.Net)也会有出色、快速的网站。

我的意思是:开发人员的天赋将比两个(在某种程度上大致相等)技术之间的选择更影响总体速度。

实际上,“整体速度”比较并没有太多意义,因为两者可以以某种方式追赶对方,除非你处于非常特定的专业领域(你没有告诉我们)。


18

我已经完成了性能测试。

程序:10000000个数字的总和

输入图像描述

输入图像描述

给出的输出证明php比C#慢............


5
当使用HHVM来运行PHP时,性能差异如何?这两种测试的代码是什么样子的? - Drellgor
8
准确地说,C#/.NET 比 PHP 完成这个测试快了 42 倍。 - Craig Tullis
2
好的,服务器很快就会生成结果。请注意,ASPx大小为285字节,而Php大小为49字节。因此,如果用户使用较慢的连接,你猜会发生什么?或者考虑一下访问该网站的用户的互联网账单? - aimme
3
OP希望比较.NET MVC和.NET WebForms。通过检查两个输出的大小,可以清楚地看出test.aspx页面是使用.NET WebForms编写的,而不是.NET MVC。使用.NET MVC,输出的大小可以与PHP相同。因此,用户的连接速度或互联网账单将无关紧要。 - MÇT
4
给定的输出证明,在神知道测试是在什么条件下进行且谁知道代码是如何编写的情况下,PHP比C#更慢。 - Reuel Ribeiro
显示剩余3条评论

15

我会推荐使用ASP.net。

需要考虑以下几点:

  • ASP.net是预编译的
  • ASP.net通常是用C#编写的,执行速度应该比PHP更快

当然,这些差异非常微小。两者都有优点,我认为PHP更容易部署,并且可以在任何服务器上运行,而不仅仅是IIS。不过我非常喜欢ASP.net MVC。


.NET Core 的改变在于能够部署到任何服务器。 - Jacques

14

我是一名专业开发人员,精通ASP.Net C#和PHP5技术。多年来在实际生产环境中比较它们,我的印象如下:

  • 首先,不能用添加值100万次的循环来比较它们,这不是一个真实情况。

  • 将它们比较在我的开发环境中和在真实生产环境中不同。例如:在开发中,ASP.Net默认不使用IIS,而是使用具有不同优化的内部开发服务器。在开发环境中,没有并发性能问题。

我的观点如下:

  • 循环100万次,C#会更快。(无意义)

  • 提供访问数据库、显示图像、包含表单等实际页面时,ASP.Net比PHP慢。

  • ASPX页面比PHP重10倍,这使最终用户需要等待更长时间才能获取页面。

  • ASPX开发比PHP慢,这很重要,因为最终涉及到金钱。我们在PHP中比ASP.Net快35%,因为每次想要检查东西都需要进行编译和重新启动。

  • 对于大型项目,ASP.Net长期来看更好,可以避免错误并具有复杂的架构。

  • 由于Windows服务器和IIS等原因,最终您需要一个强大的服务器来承载与PHP相同数量的用户。例如:我们使用ASP.net提供约20,000个并发用户,并且在PHP中,同一台服务器可以获得约30,000个用户。

重要的不仅是循环哪个更快。重要的是当网站真实上线时,它们能够承载多少用户,页面有多重(越重==>用户等待时间更长,服务器的网络负担更重,磁盘负担更重,内存负担更重)。尝试检查并发时间,您会发现这点。

希望对您有所帮助。


6
如果您提供一些合理的指标或实际文章的链接,我才能对这个答案做出回应。根据我的经验(其中包括在从PHP到Python再到.NET等各种运行时环境中进行15年Web应用程序和应用程序服务器开发),PHP是迄今为止最慢的运行时环境。您是否可能将ASP与ASP.NET MVC混淆了?因为问题实际上是关于比较使用PHP MVC框架(但这不是必需的)开发的Web应用程序和使用ASP.NET MVC开发的Web应用程序。 - uygar.raf
1
感谢您发布这个“答案”,它确实增加了有价值的信息并提出了其他需要考虑的领域。人们没有意识到的是,他们应该对任何回复持保留态度,而不是默认为答案。 - Paul Cristea
2
好的反馈。太糟糕了,微软粉丝们给你的答案投了反对票。我个人认为,与.Net相比,php开发更快、更容易、更简单。此外,在实际环境中应用程序的响应时间在严格限制的服务器硬件上也非常令人印象深刻。现在我可以看出为什么Php如此受欢迎了。 - TheLegendaryCopyCoder
@TheLegendaryCopyCoder 我认为他们被贬低并不是因为他们是微软的粉丝。而是因为Christian在比较错误的东西。ASPX比Asp.net MVC慢得多,负载也更大 - 它是旧技术。将即将过时的.NET技术与现代PHP环境进行比较是没有意义的。 - Jacques
我也有在 PHP 和 C# 中构建大型应用程序的经验。它们之间有很大的区别。.NET 的开发速度较慢,执行速度也较慢。然而,当你使用 PHP5 或 7、C#与EF或自己的DAL进行构建时,体验也会大不相同。也就是说,你的代码可能会产生戏剧性的影响。 - JonathanC

7

没有任何优化的情况下,.net编译应用程序当然比php运行得更“快”。但你是正确的,这是一个愚蠢而无关紧要的论点,因为除了吹牛之外在现实世界中没有任何意义。


3
一般而言,ASP.Net在相同硬件上的表现比PHP更好。 ASP.Net MVC的表现更佳(这里的关键词是“可能”)。大部分平台都是为企业开发而设计,可测试的代码、关注点分离等。ASP.Net中很多冗余来自于页面内的对象堆栈(嵌套控件)。预编译可以提高性能,但也可能成为一个关键问题。MVC倾向于使用基于WebForms的视图引擎(其他引擎也可用),从而减少嵌套。
Web应用程序最大的减速通常出现在远程服务,特别是数据库持久化。PHP不带有连接池或内存会话状态的优势。这可以通过memcached和其他更高效的服务层(.Net也可用)来克服。
实际上,这取决于网站/应用程序的具体情况。这个网站在相当一般的硬件上运行MVC非常好。类似的PHP网站可能会因负载过重而崩溃。还有其他需要考虑的事情,比如IIS vs. Apache vs. LightHTTPD等。老实说,php vs asp.net 与其说是原始性能差异,不如说是PHP不像asp.net mvc那样适合大型复杂应用程序,这与VS+SCC有关。

1
需要注意的是问题是.NET MVC vs PHP,而不是.NET(Web Forms)vs PHP。
我没有确切的事实,但一般感觉是PHP网站比.NET Web表单网站运行得更快(而我只做.NET)。尽管.NET Web表单是编译的,而PHP是解释的,但.NET Web表单通常很慢,因为.NET引擎自动生成的所有代码块用于呈现设计模式下使用的每个的HTML。让.NET Web表单与PHP竞争速度是一次完整的奥德赛,从设置EnableViewState = false开始,最终可能会使用每个带有runat = server的html控件...疯狂吧?
现在,MVC是另一回事,我使用.NET MVC2制作了两个网站,感觉很好,你现在可以感受到速度!代码像任何PHP网站一样干净。因此,现在,MVC允许您编写与PHP一样干净的代码,并且MVC针对PHP解释进行编译,这只能导致一件事,即MVC比PHP更快...时间将证明,当普遍感觉是“MVC网站比PHP运行得更快”时,我们将正确地说出今天我所说的话。
再见!

1

我倾向于同意你的观点(即ASP.NET MVC更快),但为什么不与你的朋友打个友好的赌,并分享结果呢?创建一个非常简单的动态页面,从MySQL数据库中派生,并多次加载该页面。

例如,创建一个包含100万行的表,其中包含顺序主键,然后是第二列中的随机数字。 您的每个站点都可以接受GET中的主键,根据传入的密钥检索随机数字,并在某种类型的动态生成的HTML中显示随机数字。

我很想知道结果...如果您有博客或类似的东西,全世界也会这样想(这个问题一直被问到)。 如果您能够在常规ASP中构建这个简单的小应用程序,那就更好了。 哎呀,如果测试设计得好,我甚至会为这些结果付费。 说真的-只要在这里表达您的兴趣,我就会发送我的电子邮件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接