请解释一下Symfony2与ZendFramework 2的性能结果

时间:2012-11-30 23:56:38

标签: performance apache symfony doctrine-orm zend-framework2

我们正在使用Doctrine2与ZetrFramework2和Doctrine2对Symfony2进行基准测试。

测试包括裸ZF2和SF2 Hello World的基线Vs.同样但是Doctrine2加载了一个简单的对象。我们使用ab并仅测量每秒请求和每个请求的时间。

在裸框架测试期间,Hello World ZF2的性能比SF2好近2倍。

然而,当我们进行相同的测试但是将Doctrine2添加到混合物中时,结果被反转。 SF2 + D2表现为ZF2 + D2快2倍。

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

一些想法: - 我们相信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 个答案:

答案 0 :(得分:7)

默认情况下,DoctrineORMModule集成没有任何缓存活动。

您必须在配置中为映射设置缓存:

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

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

由于我也是ZF2-Doctrine2集成的维护者,我可能也有兴趣了解有关此主题的更多信息。您是否有要显示的测试环境?

答案 1 :(得分:0)

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

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

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

此外,将响应时间转换为“每秒请求数”是没有意义的,尽管我知道这在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);