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

2022-08-30 11:16:00

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

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

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


答案 1

最后,这一切都归结为正确的缓存处理...

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

如果您使用像VarnishESI这样的反向代理(边缘侧包含),并最终提供模板的某些部分,您确实需要通过symfony进行更新。您将拥有极快的体验。

此外,如果您使用像APC这样的操作码缓存和优化的数据库,人类用户实际上不会注意到现实世界中几毫秒的差异。

根据要求,我会更深入地研究,并给你一些更多的事情来思考。


缓存和性能

借助云服务(s3,ec2,gae,...),几乎免费与负载平衡器配对,轻松配置(厨师,木偶,...)以及所有这些时髦的东西,即使对于小公司来说,运行和管理大数据和/或高流量应用程序也变得简单且价格合理。

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

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

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

那么,为什么这些网站没有完全崩溃呢?因为它们的缓存例程很聪明。

脸书

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

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

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

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

在“真实世界”场景中,最终用户会注意到框架之间的 req/sec 没有差异。即使使用像微缓存这样的简单内容,一旦您在hackernews的登录页面上完成,您也可以让您的vps托管博客不会立即关闭。

最后,更重要的事情是...我的框架是否提供了工具,文档,教程和示例...让整个事情快速而轻松地启动并运行。symfony为我做!

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

你通过选择一个框架来选择一个社区!

...好吧,这是为了它很重要的部分...现在回到这些基准:)


基准测试和设置

在基准测试中所有这些闪亮的颜色和花哨的图形中,您很容易错过这样一个事实,即只有一个设置(Web服务器,数据库等)使用每个框架进行了测试,而您可以为每个框架提供各种各样的配置。

示例:除了使用 symfony2+doctrineORM+mysql 之外,你还可以使用 symfony+doctrineODM+MongoDB。

MySQL ...MongoDB ...关系数据库 ...NoSQL Databases ...奥姆...微型 ORM ...原始 SQL ...所有这些都混合在这些配置中,------>苹果和橙子。


基准测试与优化

几乎所有的基准测试(即使是那些仅比较php框架的基准测试)以及那些在Web上找到的“TechEmpower Web Framework Benchmarks”的常见问题是不平等的优化

这些基准测试没有利用这些框架上可能的(以及经验丰富的开发人员众所周知的)优化......至少对于symfony2和他们的测试来说,这是一个事实。

关于他们最新测试中使用的symfony2设置的几个例子:

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

列表还在继续...但我想你明白这会导致什么。目前有90期未决问题...一个无尽的故事。


开发与资源

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

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

在选择框架时,您还选择了用于快速开发的工具包 - 这是您对抗从未完全满足的,功能蔓延的客户的战斗武器......他会为他的愿望付给你好钱。

作为代理商(或自由职业者),您希望在短时间内构建功能丰富的应用程序。您将面临陷入困境的点...也许是与性能相关的问题。但是,您还面临着开发成本和时间。

什么会更贵?其他服务器还是其他开发人员?


答案 2

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

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

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

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


推荐