5

我们用 Doctrine2 对 Symfony2 进行基准测试,而用 Doctrine2 对 ZendFramework2 进行基准测试。

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

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

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

我们在 Symfony2 和 ZendFramework 方面都有内部技能,所以我们可以选择两者之一,而且我们不关心 RAM 的使用,因为我们总是可以获得更多的 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
4

2 回答 2

7

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

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

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

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

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

于 2012-12-01T02:49:52.733 回答
0

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

永远不要因为性能差异如此之小而选择框架。通过框架上的缓存和数据库改进,您将获得更多性能。

除非您正在构建财务实时应用程序,否则 10 或 20 毫秒的响应时间差异不算什么。网页的平均响应时间通常为 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);
于 2013-02-25T13:29:44.083 回答