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

时间:2009-03-28 01:04:40

标签: php asp.net-mvc arguments

我和一位同事就这个问题进行了友好的争论,我个人认为ASP.NET-MVC编译的Web应用程序比用PHP编写的同一个项目更有效/更快地运行。我的朋友不同意。

不幸的是,我没有任何可用于备份我的论点的可靠数据。 (他也不是)

对此,我试图向谷歌寻求答案,试图找到证据证明他是错的,但大多数时候辩论变成了哪个平台更好地开发,成本,安全功能等......为了这个论点,我真的不在乎任何一个。

我想知道堆栈溢出社区对ASP.NET中使用MVC开发的网站的原始速度/效率与使用PHP开发的完全相同的网站的原始速度/效率的看法?

有没有人在真实场景中比较两种技术的性能有任何实际例子?

(我意识到你们中的一些人很可能是一个无关紧要的,也许是愚蠢的论点,但这是一个争论,我仍然希望在这里听到优秀人才的答案)

11 个答案:

答案 0 :(得分:65)

这是一个艰难的比较,因为各个堆栈的差异意味着你最终会以不同的方式做同样的事情,如果你为了比较而这样做,那么这不是一个非常现实的测试。

PHP,我喜欢,它是最基本的形式,加载了每个请求,解释然后丢弃。它在这方面非常像CGI(考虑到大约15岁,这并不奇怪。)

现在多年来已经进行了各种优化以改善性能,例如,最明显的是使用APC进行操作码缓存(以至于APC将成为PHP 6的标准部分,而不是像现在这样的可选模块)

但PHP脚本基本上都是短暂的。会话信息(通常)基于文件且互斥(session_start()阻止访问相同用户会话的其他脚本,直到session_commit()或脚本完成),而ASP.NET中不是这种情况。除了会话数据之外,在ASP.NET(或者Java就此问题,与ASP.NET更相似)中的应用程序上下文中存在对象是相当容易的(也是正常的)。

这是一个关键的区别。例如,PHP中的数据库访问(使用mysql,mysqli,PDO等)是暂时的(尽管持久连接),而.Net / Java几乎总是使用持久连接池,并在此基础上构建ORM框架等,超出任何特定要求的缓存。

作为字节码解释平台,ASP.NET在理论上更快,但PHP可以做的限制是如此之高,以至于对大多数人来说无关紧要。例如,互联网上前20个访问过的网站中有4个是PHP。当您开始扩展比任何理论速度差异时,开发速度,稳健性,运行环境成本等等往往更为重要。

请记住.Net具有原始类型,类型安全性以及使代码比PHP运行更快的代码。如果您想进行一些不公平的测试,请在两个平台中对一百万个随机64位整数进行排序。 ASP.NET会杀死它,因为它们是原始类型,简单数组将比PHP的关联数组更有效(并且PHP中的所有数组最终都是关联的)。加上32位操作系统上的PHP将没有本机64位整数,因此会遭受巨大损失。

还应该指出,ASP.NET是预编译的,而PHP是即时解释的(不包括操作码缓存),这可能会有所不同,但PHP在这方面的灵活性是一件好事。能够在不弹跳服务器的情况下部署脚本非常棒。只需将其放入即可。辉煌。但最终效果不佳。

最终,虽然我认为你在争论什么是真正无关紧要的细节。

答案 1 :(得分:29)

ASP.NET运行速度更快。 ASP.NET开发速度更快。 购买快速计算机,如果您进行严肃的商业网络应用程序,则享受它

与PHP相比,ASP.NET代码的执行速度要快得多,当它在发布模式下构建,优化,缓存等等。但是,对于网站(除了像Facebook这样的大玩家),它不那么重要 - 页面的大部分时间渲染时间是访问和查询数据库。

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

相比之下,PHP在请求之间不能保持sql server连接,它连接,从db中获取数据并销毁,当重新连接数据库时,页面渲染时间往往是20-30%。

此外,整个Web应用程序配置在每次请求时都会在php中重新加载,在asp.net中它会持久存储在内存中。在像symfony / symfony2这样的大型企业框架中可以很容易地看到它,很多渲染时间都是symfony内部处理,asp.net只加载它一次,不要浪费你的服务器进行无用的工作。

ASP.NET可以在应用程序内存中保存缓存中的对象 - 在php中,您必须将其写入文件,或者使用像memcache这样的hack。使用memcache是​​很多处理并发和危险问题(在文件中存储缓存也有自己的并发问题 - 每个请求启动apache服务器的新线程,许多请求可以一次工作 - 你必须考虑那些之间的并发线程,它需要大量的开发时间,并不总是工作,因为PHP没有语言中的任何互斥机制,所以你不能以任何方式制作关键部分。)

现在关于开发速度: ASP.NET有两个主要的框架(Webforms和MVC),安装了环境,在PHP中你必须得到一个开源框架。在asp.net中没有像php那样的标准框架。

ASP.NET语言非常丰富,标准库为非常常见的问题提供了解决方案,其中PHP标准库是......裸...它们不能保留一个命名约定。

.NET有类型,其中PHP是动态的,因此在您运行它或编写单元测试之前,它意味着无法控制源代码。

.NET有一个很好的IDE,其中PHP IDE是平均或平均良好的(PHPStorm仍然比VS + resharper差很多甚至没有它)

当ASP.NET脚手架集成到环境中时,symfony中的PHP脚手架从命令行触发。

如果你有像我这样的慢速计算机(一个核心2,2ghz),开发asp.net页面可能会很痛苦,因为你必须在任何源代码更改时重新编译项目,PHP代码会立即刷新。

与C#语法相比,PHP语言语法是如此未完成,不固定和裸露。 C#中强大的类型和许多灵活的语言功能可以加速您的开发并使您的代码减少错误。

答案 2 :(得分:20)

在我的(非硬件标记)体验中,Asp.Net在原始速度方面肯定可以与PHP竞争(并且在一些领域超越)。但与许多其他与语言选择相关的问题类似,以下陈述(在这种情况下)是有效的(在我看来):

  • 语言x中存在缓慢的错误网站(无论是PHP还是Asp.Net)
  • 语言x中有很棒的快速网站(无论是PHP还是Asp.Net)

我想说的是:(开发人才)将影响整体速度,而不是两者之间的选择(在一些抽象范围内大致相当)。

实际上,“整体速度”比较没有多大意义,因为两者都可以以某种方式相互追赶,除非你处于一个非常特殊的专业领域(你没有告诉我们)

答案 3 :(得分:13)

我会说ASP.net

需要考虑的事项:

  • ASP.net已预编译
  • ASP.net通常用C#编写,它应该比PHP执行得更快

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

答案 4 :(得分:13)

我已经完成了性能测试。

计划:10000000数字的总和

enter image description here

enter image description here

鉴于输出证明php比C#............

答案 5 :(得分:5)

没有任何优化,.net编译的应用程序当然会比php运行“更快”。但你是正确的,这是一个愚蠢而无关紧要的论点,因为它与吹嘘权利之外的现实世界无关。

答案 6 :(得分:3)

一般来说,ASP.Net在给定硬件上的表现要比PHP好。 ASP.Net MVC可以做得更好(可以在这里作为操作词)。大多数平台的设计都考虑到了企业开发。可测试代码,关注点分离等.ASP.Net中的许多膨胀来自页面内的对象堆栈(嵌套控件)。预编译可以提高性能,但它可能是一个关键问题。 MVC倾向于允许使用基于webforms的视图引擎(其他人可用)进行较少的嵌套。

Web应用程序发生的最大速度下降往往是远程服务,尤其是数据库持久性。 PHP的编程没有连接池或内存会话状态的好处。这可以通过memcached和其他更高性能的服务层(也可用于.Net)来克服。

这真的取决于网站/应用程序的细节。这个网站碰巧在相当适中的硬件上运行MVC。 PHP下的类似网站可能会受到自身的影响。其他需要考虑的事情。 IIS与Apache vs LightHTTPD等。老实说,php vs asp.net远远超过原始性能差异。 PHP对于大型复杂的应用程序来说非常适合asp.net mvc,就这么简单......这本身与VS + SCC有关,而不是其他任何东西。

答案 7 :(得分:1)

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

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

我很想知道结果......如果你有一个博客或类似的东西,世界其他地方也会这样(这个问题一直被问到)。

如果您可以在常规ASP中构建这个简单的小应用程序,那就更好了。哎呀,如果测试设计得很好,我甚至会付钱给你这些结果。说真的 - 只是表达你的兴趣,我会给你发电子邮件。

答案 8 :(得分:1)

需要注意的问题是.NET MVC与PHP,而不是.NET(Web Forms)与PHP。 我没有事实,但总的感觉是PHP网站比.NET Web表单站点运行得更快(我只做.NET)。 .NET Web表单尽管被编译和解释,但PHP通常很慢,因为.NET引擎自动生成的所有代码块都为每个< asp:control>你在设计模式上使用。获取.NET Web表单以与PHP竞争速度是一个完整的odisea,从设置EnableViewState = false开始,并且可以结束使用runat = server的每个html控件...疯狂呃?

现在,MVC是一个不同的故事,我使用.NET MVC2创建了两个网站,感觉很好,你现在可以感受到速度!和代码一样干净,任何PHP网站。所以,现在,MVC允许你像PHP一样编写干净的代码,并且MVC是针对PHP编译而编译的,它只能导致一件事,MVC比PHP快...时间会证明,当一般意义上是“MVC网站运行比PHP更快“那么我们今天在这里说的就是对的。

看/你/!

答案 9 :(得分:1)

我是这两种技术的开发专家(ASP.Net c#和PHP5)。    经过多年的努力并在实际生产环境中进行比较,这些都是我的印象:

  • 首先,不能比较他们制作一个增加值1.000.000的循环,这不是一个真实的案例。

  • 在我的开发环境中比起真实的生产环境不一样。例如:在开发中,ASP.Net默认不使用IIS,使用具有不同优化的Inner Development服务器。在开发中,没有并发性。

所以我的观点是下一个:

  • 循环播放1.000.000次c#会更快。(无意义)

  • 提供真实页面,访问数据库,显示图像,有表格等.... ASP.Net比PHP慢。

  • ASPX页面的重量比PHP重10倍,因此最终用户可以等待更多时间来获取页面。

  • ASPX的开发速度比PHP慢,这很重要,因为最后是钱。我们开发的PHP比ASP.Net快35%,因为每次你想检查smthg时都要编译并重新启动。

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

  • 由于Windows服务器,IIS,....最后,你需要一个功能强大的服务器,在ASP上拥有与PHP相同数量的用户。例如:我们为ASP.net提供20.000个并发用户,在PHP中,同一个服务器可以获得大约30.000个用户。

唯一重要的不是循环哪一个更快。问题是当网站是真实的并且正在生产时,他们可以容纳多少用户,页面有多重(更重= =更多来自用户的等待时间,更多的服务器净费用,更多的服务器磁盘费用,更多的内存费用服务器)。 尝试使用并发检查时间,你会看到。

希望它有所帮助。

答案 10 :(得分:-2)

C ++ ...现在,争斗将在PHP和ASP.NET之间展开。 PHP将在易用性方面取胜,ASP.NET将在性能上获胜(在Windows服务器生态系统中)。许多以php开头的大型网站已经毕业于C ++。