为什么Symfony2在基准测试中表现如此糟糕,这是否重要?

45

我和同事们正在选择一个Web框架来开发高流量的网站。我们非常擅长使用node.js + expressphp + symfony2。这两个框架都很好,但我们有点担心Symfony2,因为它似乎被大多数其他Web框架所超越。

以下是证明它表现不佳的基准测试: http://www.techempower.com/benchmarks/

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


2
我觉得很奇怪Zend框架没有作为测试的一部分,尽管其他方面有一些有趣的结果。 - Adam Elsodaney
2个回答

128
最终,一切都取决于正确的缓存处理...
Symfony或PHP总体而言比其他语言或框架慢,因此为您提供了创建丰富、安全且可测试的Web应用程序所需的工具,确实很快。
如果您使用像Varnish这样的反向代理和ESI(边缘侧包含),并通过Symfony服务模板的真正需要更新的部分,您将获得惊人的快速体验。
另外,如果你使用像APC这样的opcode缓存和优化数据库,实际上在现实应用程序中,人类用户不会注意到几毫秒的差异。
根据要求,我将深入探讨并给您更多可以考虑的事情。
缓存和性能
随着云服务(s3,ec2,gae等)几乎没有成本与负载平衡器、易于配置(chef,puppet等)以及所有这些有趣的东西配对,即使是小公司也可以轻松管理大数据和/或高流量应用程序。
更多的存储意味着更多的缓存空间 - 更多的计算能力意味着更快的缓存预热。
如果人们谈论php或框架的性能,你通常会听到以下内容:
Facebook使用php运行
YouP**n使用Symfony开发
...
那么这些网站为什么不会完全崩溃呢? 因为他们的缓存程序很聪明。
Facebook
例如,您知道如果在facebook上发布状态更新会发生什么吗?
它不会将其保存到所有状态更新的数据库表中,如果某个朋友访问其流,则会从数据库中获取所有朋友的所有状态更新,然后再提供服务。
Facebook会将您的状态写入所有朋友的新闻流中,并开始预热它们的缓存。现在,所有流都准备好提供服务,每当您的朋友访问自己的流时,他将立即获得一个已缓存的版本; 几乎没有代码执行涉及即可完成。只有在缓存预热完成后,流才会显示您新创建的状态。我们在这里谈论的是ms ...
这告诉我们什么? 在现代高频应用程序中,几乎所有东西都是从缓存中提供的,用户不会注意到页面实际计算需要1毫秒还是5秒。
在“真实世界”场景中,最终用户将不会注意到框架之间的请求/秒差异。 即使是像微型缓存这样简单的东西,您也可以让VPS托管的博客不会立即在登陆hackernews的页面上崩溃。
最重要的是:我的框架是否为我提供了快速轻松上手所需的工具、文档和教程和示例。 对我来说,Symfony做到了这一点!

如果你遇到困难,需要解决与性能相关的问题,有多少人愿意并且能够回答你的问题呢?有多少真实的应用程序已经或者在不久的将来将会使用这个框架创建?

选择一个框架就是选择了一个社区!

...好吧,那是关于它是否重要的部分 ... 现在回到这些基准测试 :)


基准测试和设置

在这些基准测试的所有闪亮色彩和花哨的图表中,您很容易忽略一个事实,即每个框架仅测试了一个设置(Web服务器、数据库等),而您可以为每个框架选择各种配置。

例如:您可以使用symfony+doctrineODM+MongoDB,而不是使用symfony2+doctrineORM+mysql.

MySQL… MongoDB…关系型数据库… NoSQL数据库… ORM…微型ORM…原始SQL…所有这些混合在这些配置中———苹果和橙子。


基准测试和优化

几乎所有基准测试的常见问题 - 甚至包括那些仅比较php框架的基准测试 - 在网上找到的以及那些“TechEmpower Web Framework Benchmarks”中发现的是不同的优化。

这些基准测试没有利用那些框架上可能存在的(并且被经验丰富的开发人员熟知的)优化...至少对于symfony2和他们的测试来说是事实。

以下是他们最新测试中使用的symfony2设置的一些示例:

  • 没有使用“-o”标志调用composer install以输出优化的类映射自动加载器 (代码)
  • Symfony2不会为Doctrine元数据注释使用APC缓存,除非设置apc_cli = 1 (问题)
  • 整个DI容器被注入到控制器中,而不仅是一些必要的服务
  • 这里使用setter注入 -> 创建对象,然后调用setContainer()方法,而不是直接将容器注入到构造函数中 (参见: BenchController 扩展 Controller 扩展ContainerAware)
  • 使用别名($this->get('service_name'))从容器中检索服务,而不是直接访问它($this->container->get('service_name')). (代码)
  • ...

这个列表还在继续...但我想你已经明白了这是什么意思。现在有90个未解决的问题...一个无尽的故事。


开发和资源

像服务器和存储这样的资源很便宜...相比之下,开发时间则显得非常昂贵。

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

当选择一个框架时,你也在选择一个快速开发的工具包——对抗从未满足、不断增加功能的客户的武器...他们会为他们的愿望付出高昂的代价。

作为一个机构(或自由职业者),你希望在短时间内构建功能丰富的应用程序。你将面临某些困境...也许是与性能相关的问题。但你也面临开发成本和时间成本。

什么会更昂贵?额外的服务器还是额外的开发者?


5
你确定所有的问题都出在缓存上吗?Symfony和Express有同样的缓存能力(模板/静态资源等)。你是说每秒请求数量如此微不足道,以至于我们不应该考虑它吗? - Jean-Philippe Leclerc
2
“增加一台服务器还是增加一个开发人员更昂贵?”这个问题被很多网络爱好者所忽视,他们盲目地认为基准测试中最低的“ms”是最好的选择。 - Carrie Kendall
12
非常好的回答。关于这个主题,这是我见过最好的解释。 - d0001
2
通常框架的作用是为了让你的开发工作更快。但如果每次我实现某些功能都要等待30秒,那么我的开发速度就会变慢。当然,缓存是一种解决方案,但在开发环境中并不适用。我对Symfony的性能有些困惑,因为我正在使用它。即使是声名非常缓慢的Magento商店,加载速度也比Symfony快得多! - Alexandre
1
拥有一个能够在不到一秒钟内提供响应的Symfony2 dev环境非常容易和直接,除非你正在做一些疯狂的事情,比如复杂的数据库或外部API查询。我希望**你的问题*的答案能够帮助你尽快解决你的配置错误*设置/应用程序问题@Alexandre ;) - Nicolai Fröhlich
显示剩余6条评论

1
这篇博客回答了你问题的第二部分: http://symfony.com/blog/is-symfony-too-slow-for-real-world-usage 引用如下:
放弃Symfony只是因为“Hello, World”测试速度不如FooBar框架是一个错误。对于专业人士而言,原始速度并不是关键因素。成本才是关键因素。使用Symfony开发、托管和维护应用程序的成本比其他解决方案要低。
在选择框架时,应考虑开发的总成本。这意味着要查看框架的代码质量(单元测试、文档等)、性能(和托管成本)、开箱即用的功能数量和质量、社区规模、像你这样的组织的使用情况、可扩展性等。
作为一名Symfony开发者,从技术角度来看,我非常讨厌WordPress。但是对于一个简单的网站,我仍然会推荐(甚至使用!)它。这并不仅仅因为它的流行度,而是因为它拥有庞大的社区:很容易雇佣到WordPress设计师/开发人员。在这种情况下,比较WordPress和Symfony的性能是没有任何意义的。

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