2012-11-30 23 views
5

我们正在用Doctrine2对比Symfony2和ZendFramework2。请解释这个Symfony2与ZendFramework 2的性能结果

该测试包括一个裸露的ZF2和SF2 Hello World的基线比。与Doctrine2一样,加载一个简单的对象。我们使用ab并且仅测量每个请求每秒的请求和时间。

在裸框架测试期间,Hello World ZF2的性能比SF2好得多,几乎是2x的两倍。

但是,当我们做了相同的测试,但添加了Doctrine2的混合结果倒过来。 SF2 + D2表现为ZF2 + D2的2倍速。

我们拥有Symfony2和ZendFramework的内部技能,所以我们可以选择其中一种,或者我们不关心内存使用情况,因为我们总能获得更多内存。但我们关心性能,我们需要帮助最好的工具。

一些想法: - 我们相信S2是做某种缓存 的 - 我们相信ZF2 Doctrine2 ORM模块的原因可能 - 我们不能确定为在生产中使用的缓存类型? APC?了XCache?等

Framework + Doctrine loading an object  
Concurrent:100/Connections: 1000  
    Resp. T ms Req. Sec 
ZF2  60 16 
S2   31 32 

Framework + Doctrine loading an object  
Concurrent: 25/Connections: 150  
    Resp. T ms Req. Sec 
ZF2   57 17 
S2   30 32 


====================== 

Framework Bare  
Concurrent: 100/Connections: 1000  
    Resp. T ms Req. Sec 
ZF2   10.5 94 
S2   15.3 65.36  

Framework Bare  
Concurrent: 25/Connections: 150  
    Resp. T ms Req. Sec 
ZF2   10 98 
S2   15.4 64 
+2

问候世界是每个框架如何运行的开箱,并获得计算机的能力和所需的Apache配置初始测量的基准。测试涉及许多其他测试,但我只是提到最相关的测试。我们做了低,中,高音量测试,并发,单一,本地,远程,hello world,加载100,1000,10000个对象,迭代等等等等等。这不像我们可以在两个框架中构建一个完整的应用程序来进行测试,因此我们在开始开发之前正在尽我们所能。 – smorhaim

回答

7

默认情况下,DoctrineORMModule集成有没有一种缓存活跃。

你必须在你的配置设置映射缓存:

'doctrine' => [ 
    'driver' => [ 
     'orm_default' => [ 
      'class' => 'Doctrine\ORM\Mapping\Driver\DriverChain', 
      'drivers' => [], 
      'cache' => 'apc', 
     ], 
    ], 
], 

默认的缓存是array。否则,每个请求都会发生注释解析和任何其他类型的映射。

因为我也是ZF2-Doctrine2集成的维护者,所以我也可能有兴趣了解关于此主题的更多信息。你有测试环境来展示吗?

+0

噢,我们将再次尝试使用这些设置。我们实际上使用ZF2D2部署了一个小型应用程序,并且由于消耗了比我们分配的内存更多的内存而使其崩溃,并且我们必须回滚...因此这就是我们这样做的原因 - 另一方面,我们有一个巨大的数据库密集型应用程序(使用数据库集群复制多主控制器)在生产中低至中等使用6个月,并且其工作状况良好...是的,我们有一个测试环境。你有任何其他建议或想法如何测试?我们希望尽可能将苹果测试作为苹果。 – smorhaim

+0

建议将共享您的“你好世界与实体”的配置。更好,如果作为一个小模块:) – Ocramius

+0

另外,请注意,部署任何没有元数据缓存的是纯粹的疯狂。元数据解析涉及很多反射和代码扫描操作。 – Ocramius

0

通过正确缓存操作码(APC)和数据库请求(例如Memcache),我会说Synmfony和Zend之间的区别是花生。

永远不要选择一个框架,因为这么小的性能差异。在框架中,您将获得更多的缓存和数据库改进性能。

除非你正在建立一个财务实时应用程序,或者有点,10或20ms的响应时间差异是没有什么。网页的平均响应时间通常在100 ms以内!

此外,将响应时间转换为“每秒请求数”是没有意义的,尽管我知道这在PHP基准测试中很常见。由于您的Apache不会按顺序处理请求(一个请求不会消耗100%的CPU),所以同时到达的5个请求的服务时间将少于一次请求的5倍。

正如Ocramius说,你应该激活元数据缓存:

$frontendOptions = array(
     'lifetime' => 7200, // seconds 
     'automatic_serialization' => true 
    ); 

    $backendOptions = array(
     'cache_dir' => APPLICATION_PATH_CACHE 
    ); 

    $this->cache = Zend_Cache::factory('Core', 
           'File',//Memcache is better 
           $frontendOptions, 
           $backendOptions); 

    //ADD a metadata cache for DB, important for perf 
    Zend_Db_Table_Abstract::setDefaultMetadataCache($this->cache); 
+0

您粘贴的示例与Doctrine 2 ORM无关...... – Ocramius