为什么Symfony2在基准测试中表现如此糟糕?这有关系吗?

时间:2013-05-22 16:15:59

标签: symfony web benchmarking

我和我的同事正在选择一个Web框架来开发一个高流量的网站。我们对node.js + expressphp + symfony2非常满意。两者都是很棒的框架,但我们对Symfony2有点担心,因为它似乎比大多数网络框架都要好。

以下是证明它的基准: http://www.techempower.com/benchmarks/

出于这个原因,我们可能会使用node.js + express,但我仍然想知道为什么Symfony2在基准测试中表现如此糟糕。

2 个答案:

答案 0 :(得分:127)

最后,所有这些都归结为纠正缓存处理 ...

symfony或PHP通常比其他语言或框架慢,因此为您提供了快速创建丰富,安全且可测试的Web应用程序的工具。

如果您使用反向代理,例如 Varnish ESI (边缘包括)并最终提供模板的部分,您确实需要通过symfony进行更新。你会有一个非常快速的经历。

此外,如果您使用 APC 等操作码缓存和优化数据库,那么人类用户实际上并未注意到现实世界中几毫秒的差异应用

根据要求,我会更深入地思考一下,并给你一些更多想法。


缓存&性能

云服务(s3,ec2,gae,...)几乎没有任何成本与负载均衡器配对,易于配置(厨师,木偶......)以及所有这些时髦的东西,它变得简单易用即使是小公司也可以负担得起运行和管理大数据和/或高流量应用程序。

更多存储意味着更多的缓存空间 - 更多的计算能力意味着更快的缓存热化。

如果人们谈论php或框架性能,你会经常听到的事情:

  • facebook用php运行
  • youp ** n是用symfony开发的
  • ...

那么为什么这些网站没有彻底崩溃?因为他们的缓存程序很聪明。

您是否知道如果您撰写状态更新,Facebook会做什么?

它不会将其保存到包含所有状态更新的数据库表中,如果朋友访问了他的流,则在提供服务之前,所有朋友的所有状态都将从数据库中获取。

facebook将您的状态写入您的所有朋友新闻流并开始加热他们的缓存。现在所有的流都准备好服务了,每当你的一个朋友访问他的流时,他将被提供缓存版本;即时几乎不涉及代码执行。当缓存预热完成时,流将仅显示新创建的状态。我们在这里谈论ms ...

这告诉我们什么?在现代高频率的应用程序中,几乎所有内容都是从缓存提供的,用户不会注意到页面的实际计算是花费1毫秒还是5秒。

在现实世界中#34;最终用户将注意到框架之间的req / sec没有差异。即使使用微缓存等简单的东西,你也可以让你的vps托管博客一旦你在黑客新闻的登陆页面上制作它就不会立即停止。

最后,更重要的是......我的框架是否提供了工具,文档以及教程和示例......以使整个过程快速完成并快速运行简单。 symfony对我有用!

如果您遇到困难......有多少人愿意并且能够回答您与绩效相关的问题? 使用此框架已经创建或将在不久的将来创建了多少个真实应用程序?

通过选择框架来选择社区!

...好吧那是重要的部分......现在回到这些基准:)


基准&设置

在基准测试中的所有这些闪亮的颜色和花哨的图表中,您很容易错过这样一个事实,即每个框架都只测试了一个设置(网络服务器,数据库......),而您可以使用各种配置他们每个人。

示例:您也可以使用symfony + doctrineODM + MongoDB,而不是使用symfony2 + doctrineORM + mysql。

MySQL ... MongoDB ...关系型数据库...... NoSQL数据库...... ORM ...微型ORM ...原始SQL ......在这些配置中都混淆了------>苹果和橘子。


基准&优化

几乎所有基准测试的常见问题 - 甚至只是比较php框架 - 在网络上发现,以及那些" TechEmpower Web框架基准测试"是不平等优化

这些基准测试不会利用可能的(以及经验丰富的开发人员众所周知的)优化这些框架......至少对于symfony2及其测试来说这是事实。

关于最新测试中使用的symfony2设置的一些示例:

  • " composer install"未使用-o标志调用以转储优化的类映射自动加载器(code
  • 如果没有apc_cli = 1(issue
  • ,Symfony2将不会将APC缓存用于Doctrine元数据注释
  • 将整个DI容器注入控制器而不是仅提供少量必要的服务
  • 使用setter注射 - >创建对象然后调用setContainer()方法而不是将容器直接注入构造函数(请参阅:BenchController extends Controller extends ContainerAware
  • 别名($ this-> get(' service_name'))用于从容器中检索服务而不是直接访问它($ this-> container-> get(&#) 39; service_name'))。 (code
  • ...

列表继续......但我猜你明白这个领先的地方。 90 open issues现在......一个无尽的故事。


发展与发展Ressources

服务器和存储等资源很便宜。真的很便宜......与开发时间相比。

我是一名自由职业者,收取相当高的费用。你可以获得2-3天的时间......或者是大量的计算能力和存储空间!

在选择框架时,您还选择了一个快速开发的工具包 - 这是一种武器,可以帮助您对抗从未完全满意,功能悄悄的客户......谁会为您的愿望付出代价。

作为代理商(或自由职业者),您希望在短时间内构建功能丰富的应用程序。你会遇到一些问题,你可能会遇到一些问题...可能与性能相关的问题。但是你也面临着开发成本和时间。

什么会更贵?额外的服务器或其他开发人员?

答案 1 :(得分:1)

此博客回答了您问题的第二部分: http://symfony.com/blog/is-symfony-too-slow-for-real-world-usage

  

解雇symfony,因为" hello,world"测试不是   与FooBar框架一样好是一个错误。原始速度不是   专业人士的关键因素。成本是关键因素。和成本   使用symfony开发,托管和维护应用程序   低于其他解决方案。

在选择框架时,应考虑开发的总成本。这意味着要考虑框架的代码质量(单元测试,文档等),性能(和托管成本),开箱即用的功能的数量和质量,社区的大小,组织的使用情况像你的,可扩展性等。

作为一名Symfony开发人员,我从技术角度热情地讨厌WordPress。但我仍然建议(甚至使用!)它用于一个简单的网站。这不仅仅是因为它的受欢迎程度,还因为它的社区规模:聘请WordPress设计师/开发人员非常容易。在这种情况下,查看WordPress和Symfony之间的性能比较是没有任何意义的。