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


74

我对此同事有一个友好的论据,我个人的观点是,ASP.NET-MVC编译的Web应用程序比用PHP编写的同一项目运行效率更高/运行速度更快。我的朋友不同意。

不幸的是,我没有任何可靠的数据可以用来支持我的论点。(他也不)

为此,我尝试向Google寻求答案,以尝试找到证据证明他是错误的,但大多数时候,辩论都转向开发哪个平台,成本,安全功能等更好。为此,论证我真的不在乎任何。

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

在现实世界的场景中,有没有人能比较这两种技术的性能呢?

(我意识到对于你们中的某些人来说,这很可能是无关紧要的,也许是愚蠢的论点,但这是一个论点,我仍然想听听这里的优秀人士的回答)


36
如果您不知道,StackOverFlow是基于ASP.NET MVC构建的。因此,这是一个使用ASP.NET MVC的出色项目的绝佳示例。
Umair Khan Jadoon'9

Answers:


69

之所以很难进行比较,是因为各个堆栈之间的差异意味着您最终做同一件事的方式不同,并且如果出于比较目的而进行相同的操作,那将不是一个很现实的测试。

我喜欢的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在这方面的灵活性是一件好事。能够在不启动服务器的情况下部署脚本非常棒。只需将其放入即可使用。辉煌。但这最终会降低性能。

最终,尽管我认为您是在争论真正不相关的细节。


5
“作为字节码解释平台,ASP.NET”-没有针对Java或.NET的解释。有2个阶段的编译:1个源代码为字节码/ IL,2个字节码/ IL为本地代码。最后,仅执行本机代码。
2009年

11
出色而有见地的比较。但我必须指出一件事:“ ...在这方面,PHP的灵活性是一件好事。能够在不启动服务器的情况下部署脚本是一件好事。” 您当然不需要在ASP.NET中启动服务器来发布代码更改。
蒂翁

@Tion与其他框架相比,我对ASP.NET热部署不那么熟悉,但是例如在Java中,您可以放入JSP文件,有时可以重新加载类,但是在很多情况下,您只需要重新启动即可。比较一下呢?
cletus

6
此回复中进行的所有比较似乎都是PHP与.NET(网络表单)的比较。关于这一点,我可以说在现实世界和实际情况下PHP的速度比.NET快。。。我改用MVC的原因...我仍然想看看PHP与.NET MVC的比较之处
Nestor

1
在.NET Core上进行更新, 请检查此内容这篇文章,它说.NET Core比PHP快,是吗?
Shaiju T

33

ASP.NET运行速度更快。ASP.NET开发速度更快。购买快速的计算机,如果您进行认真的商业Web应用程序,则可以享用它

与PHP相比,ASP.NET代码在发布模式下进行构建,优化,缓存等时,其执行速度要比PHP快得多。但是,对于网站(大型播放器(如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这样的黑客工具。使用内存缓存会大量处理并发和危险问题(在文件中存储缓存也有其并发性问题-每个请求都会启动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#中的强类型和许多灵活的语言功能可以加快开发速度,并减少代码的错误。


嘘,提到LINQ可以说明一切。常规LINQ只是常规的foreach /如果效果很好,但它可以节省几行代码,同时又可以牺牲灵活性。但是,在大多数情况下,我们谈论(最讨厌的)LINQ to SQL,这对小型项目来说很好,但对任何复杂的项目却没有用。一个简单的,封装的DAO比复杂的LINQ更干净,并且对.net和PHP有效。例如(在DAO层完成之后),获取用户对象就像调用c#一样简单:User = UserDAO.Get(id_user); 并在php $ User = $ UserDAO-> Get($ id_user);中
magallanes 2013年

4
@magallanes LINQ不仅仅是常规的foreach / if,这取决于LINQ提供程序的实现。例如,检查实体框架。一个简单的封装的DAO,没有类型化的检查查询,并且可能有SQL注入,因为开发人员错过了早上喝咖啡的方式并不太干净,而IMO相反
Luis

@Luis绝对不能否认,LINQ to SQL(像任何ORM)在大多数情况下会增加大量开销,并对性能产生负面影响。一个典型的例子是StackOverflow,它使用了很多LINQ,但是出于性能原因又撤消了很多,并用自己的本地微型ORM代替了它。
克雷格2015年

@Craig在谈论LINQ时,需要指定底层的ORM或DAO引擎,有些微型ORM具有LINQ提供程序。我个人不喜欢EF,而是喜欢微型ORM(如果它们允许进行类型化检查的查询,例如SQL Fu或ORMlite),但它与性能无关,但与透明度和可读性有关
Luis

@Luis我不认为它是LINQ,而是大多数ORMS的本质。因此,在LINQ2SQL的情况下,瓶颈实际上是企业框架。LINQ本身通常很好到优秀。一旦Microsoft将扩展方法引入C#,这将是下一个超明显的发展(感谢Objective-C !!!!)。
Craig

22

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

  • 有x语言的慢速越野车网站(无论是PHP还是Asp.Net)
  • 有很多很棒的x语言网站(无论是PHP还是Asp.Net)

我要说的是:(开发人员的)才干对整体速度的影响比在两种(在某种程度上抽象上差不多)技术之间的选择要大。

确实,“整体速度”比较没有太大意义,因为除非您处于非常具体的专业领域(您尚未告知我们),否则两者都可以某种方式相互追赶。


17

我已经做过性能测试。

程序:10000000个数字的总和

在此处输入图片说明

在此处输入图片说明

给定的输出证明php比C#慢。


5
将HHVM用于PHP时,性能有何不同?两种测试的代码看起来如何?
Drellgor

8
确切地说,C#/。NET进行此测试的速度比PHP快42
克雷格2015年

2
好的,服务器很快就会产生结果。请参见ASPx 285Bytes和Php 49Bytes的大小。还是考虑访问该网站的用户的互联网账单?
aimme

3
OP希望比较.NET MVC,而不是.NET WebForms。通过检查两个输出的大小可以清楚地看出,test.aspx页是使用.NET WebForms而不是.NET MVC编码的。通过使用.NET MVC,输出的大小可以与PHP相同。因此,用户的连接速度或互联网账单将无关紧要。
穆斯塔法(MustafaÇağatayTulun)2016年

2
我将其重写为:“给定的输出证明,上帝知道该测试是在什么条件下执行的,而谁知道该代码是如何编写的,php比C#慢...。”
Reuel Ribeiro

15

我会说ASP.net

注意事项:

  • ASP.net已预编译
  • ASP.net通常用C#编写,其执行速度应比PHP快

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


.net核心在能够部署到任何服务器方面改变了这一点
Jacques

7

如果不进行任何优化,.net编译的应用程序当然比php运行“更快”。但是您是正确的,它是一个愚蠢且无关紧要的论点,因为除了吹牛的权利之外,它对现实世界没有任何影响。


6

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

  • 首先,不能对它们进行比较,从而形成一个值1.000.000相加的循环,这不是真实情况。

  • 在我的开发环境中将它们与实际生产环境进行比较是不同的。例如:在开发中,ASP.Net默认情况下不使用IIS,请使用具有不同优化功能的内部开发服务器。在开发人员中,没有并发。

所以我的意见是下一个:

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

  • 服务于访问DB,显示图像,具有表单等的真实页面。ASP.Net比PHP慢。

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

  • ASPX的开发速度要比PHP慢,这很重要,因为最终可以赚钱。我们在PHP中开发的速度比ASP.Net快35%,因为每次您要检查smthg时都必须编译并重新启动。

  • 在大型项目中,长期使用ASP.Net可以更好地避免错误并具有复杂的体系结构。

  • 由于Windows Servers,IIS,...。最后,您需要一个功能强大的服务器来在ASP上容纳与PHP相同数量的用户。例如:我们为ASP.net提供20.000个并发用户,而在PHP中,同一台服务器可以提供30.000个并发用户。

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

希望能帮助到你。


5
在您提供一些合理的度量标准或指向实际文章的链接之前,我只能回答:根据我的经验(这包括15年的Web应用程序和应用程序服务器开发,几乎在从PHP到从Python到.NET),PHP是目前运行最慢的。您是否可能将ASP与ASP.NET MVC混淆?因为问题实际上是关于比较用PHP开发的Web应用程序(并且我相信它包括使用PHP MVC框架的假设,但这不是必须的)和用ASP.NET MVC开发的Web应用程序。
uygar.raf 2015年

1
感谢您发布此“答案”,它肯定会添加有价值的信息并提出其他要考虑的领域。人们没有意识到的是,他们应该采取任何行动,而不是事实上的回答。
Paul Cristea

2
良好的反馈。遗憾的是,MS迷们否决了您的答案。我个人发现php开发比.Net更快,更轻松,更简单。同样,在严格受限的服务器硬件上,实时环境中应用程序的响应时间也非常令人印象深刻。现在,我明白了为什么Php如此受欢迎
TheLegendaryCopyCoder

@TheLegendaryCopyCoder我不认为投票失败是因为他们是MS迷。这是因为克里斯蒂安正在比较错误的事情。ASPX比Asp.net MVC慢得多,并且有效载荷要大得多-它是较老的技术。将几乎过时的.net技术与现代PHP环境进行比较是没有意义的吗?
雅克

3

通常,ASP.Net在给定的硬件上将比PHP更好。ASP.Net MVC仍然可以做得更好(在这里可以作为执行词)。大多数平台在设计时都考虑了企业发展。可测试的代码,关注点分离等。ASP.Net中的许多膨胀来自页面内的对象堆栈(嵌套控件)。预编译使该性能更好,但这可能是一个关键问题。使用基于Web窗体的视图引擎(其他可用),MVC倾向于减少嵌套。

Web应用程序出现最大减慢的地方通常是远程服务,尤其是数据库持久性。PHP的编程没有连接池或内存中会话状态的好处。可以使用memcached和其他性能更高的服务层(也可用于.Net)来克服此问题。

实际上,这取决于站点/应用程序的细节。这个站点恰好在相当适中的硬件上运行MVC。PHP下的类似站点可能会自行承担费用。其他要考虑的事情。IIS,Apache,LightHTTPD等。老实说,php与asp.net的关系远不止原始性能差异。PHP不能很好地适合大型,复杂的应用程序,就像asp.net mvc一样,它是如此简单...它本身与VS + SCC的关系比其他任何事情都要多。


1

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

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

我很想知道结果……并且,如果您有博客或类似博客,那么世界其他地方也一样(这个问题总是被问到)。

如果您也可以在常规ASP中构建这个简单的小应用程序,那就更好了。哎呀,如果测试设计得当,我什至会为您支付这些结果。认真地说-在这里表达您的兴趣,我会给您发送电子邮件。


1

需要注意的是,问题是.NET MVC与PHP,而不是.NET(Web窗体)与PHP。我没有事实,但是总体感觉是PHP网站的运行速度比.NET Web表单网站快(并且我仅运行.NET)。尽管经过编译和解释PHP,但.NET Web表单通常速度较慢,因为由.NET引擎自动生成的所有代码块都可以为您在设计模式下使用的每个<asp:control>呈现HTML。让.NET Web表单在速度上与PHP竞争是一个完全的恶心,它始于设置EnableViewState = false,并且可以结束于将每个html控件与runat = server一起使用...疯狂吗?

现在,MVC是一个不同的故事,我使用.NET MVC2创建了两个网站,感觉不错,您现在可以感觉到速度了!并且代码与任何PHP网站一样干净。因此,现在,MVC允许您像PHP一样编写干净的代码,并且MVC是针对PHP解释编译的,它只能导致一件事,即MVC比PHP快……时间将证明,通常意义上是“ MVC网站运行比PHP更快”,那么我们今天在这里所说的话将是正确的。

再见/!


-2

C ++ ...现在,战斗将在PHP和ASP.NET之间进行。PHP将在易用性上取胜,而ASP.NET将在Windows Server生态系统中的性能上取胜。许多以php开头的较大的网站都已升级为C ++。


1
请访问stackoverflow.com/help/how-to-answer,以确保您提供良好的答案并避免投票不足。在这种情况下,毫无疑问,因为您偏离了问题的PHP与Asp.net MVC的基础,所以毫无疑问。C ++可能是一个可行的选择,但不在问题范围内。希望能
雅克(Jacques)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.