PHPEye开源社区 » Zend Framework 使用讨论 » Zend_Db_Table 缓存 Metadata会变得更加糟糕?
《Programming PHP》第二版上市
2007-7-17 19:17 wps2000
Zend_Db_Table 缓存 Metadata会变得更加糟糕?

那位已经做了ZF东西的也测试测试,如手册所说,我以为对Metadata缓存之后会提高执行效率,但是结果却正好相反

在index.php中添加一行。。。。

Zend_Db_Table::setDefaultMetadataCache(Zend_Cache::factory('Core', 'File', array( 'lifetime' => 7200,
                                                                                                                    'automatic_serialization' => true), array( 'cache_dir' => '../Cache/Table')));


测试执行效率发现有明显的降低

测试:
未添加Cache:
Concurrency Level:      30
Time taken for tests:   73.453125 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Total transferred:      1320500 bytes
HTML transferred:       1131500 bytes
Requests per second:    6.81 [#/sec] (mean)
Time per request:       4407.188 [ms] (mean)
Time per request:       146.906 [ms] (mean, across all concurrent requests)
Transfer rate:          17.55 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   2.2      0      15
Processing:   578 4326 695.2   4390    6468
Waiting:      562 4318 694.5   4375    6453
Total:        578 4327 695.3   4390    6468
Percentage of the requests served within a certain time (ms)
  50%   4390
  66%   4453
  75%   4515
  80%   4562
  90%   4718
  95%   5140
  98%   6234
  99%   6375
100%   6468 (longest request)

添加后:
Concurrency Level:      30
Time taken for tests:   85.250000 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Total transferred:      1320500 bytes
HTML transferred:       1131500 bytes
Requests per second:    5.87 [#/sec] (mean)
Time per request:       5115.000 [ms] (mean)
Time per request:       170.500 [ms] (mean, across all concurrent requests)
Transfer rate:          15.12 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   2.1      0      15
Processing:  2968 5037 415.6   5156    5562
Waiting:     2953 5030 417.3   5140    5546
Total:       2968 5038 415.7   5156    5562
Percentage of the requests served within a certain time (ms)
  50%   5156
  66%   5203
  75%   5218
  80%   5250
  90%   5296
  95%   5328
  98%   5406
  99%   5406
100%   5562 (longest request)


难道Cache只能使用memcache才是有意义的?

2007-7-17 19:22 wps2000
PS:Zend Framework的这个表现也真是不敢恭维!

OS: Windows XP
CPU: AMD Athlon 64 X2 Dual  Core Processor 3600+ 1.91GHz
RAM:1.00GB
PHP:5.23
Op Cache: X-Cache 1.21
Apache: Apache 2.059

这个配置也不算糟糕了吧,居然这么慢。。。。。。。

2007-7-17 19:24 wps2000
同样的页面,没有采用Zend_Framework 可以达到

Concurrency Level:      30
Time taken for tests:   7.156250 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Total transferred:      1211500 bytes
HTML transferred:       1130000 bytes
Requests per second:    69.87 [#/sec] (mean)
Time per request:       429.375 [ms] (mean)
Time per request:       14.313 [ms] (mean, across all concurrent requests)
Transfer rate:          165.31 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   3.0      0      15
Processing:    62  414  60.1    421     515
Waiting:       62  288  80.8    296     453
Total:         62  414  60.2    421     515

Percentage of the requests served within a certain time (ms)
  50%    421
  66%    437
  75%    437
  80%    453
  90%    453
  95%    484
  98%    500
  99%    500
100%    515 (longest request)

2007-7-17 19:26 sxpo
我也用了,简单的测了下时间,快得不多,但确实少查了一次数据库
期待高手来回答,关注

2007-7-17 19:36 sxpo
楼主在2楼的话有点过激吧,按照你的逻辑,慢也是cache这种方法慢,和zf有啥直接关系?

另外我觉得cache的用处除了以空间换时间之外,更重要的是减少数据库连接次数,你要想速度快,可以做静态文件啊,

2007-7-17 23:04 Ken
楼主可否放出测试代码,以便他人重复实验

2007-7-18 00:13 mikespook
首先,要弄清楚 table metadata 是什么,再来做这个试验才有意义~~table metadata 具体信息手册上有说。

缓存减少了数据库查询。但是如果仅仅是缓存一个表的信息,但是动用 cache 功能,同样是巨大的消耗。也就是说减少数据库查询带来的性能提升不足以弥补 cache 功能所消耗的性能。

不过如果是缓存 100 个表的 metadata,或许结果就是另外一种情况了。

另外,框架不是为了让程序运行得更快,所以不使用 zf 比使用 zf 快。直接 query sql 方式比 table data gateway 方式快。

2007-7-18 12:46 wps2000
[quote]原帖由 [i]mikespook[/i] 于 2007-7-18 00:13 发表 [url=http://www.phpeye.com/bbs/redirect.php?goto=findpost&pid=440&ptid=100][img]http://www.phpeye.com/bbs/images/common/back.gif[/img][/url]
首先,要弄清楚 table metadata 是什么,再来做这个试验才有意义~~table metadata 具体信息手册上有说。

缓存减少了数据库查询。但是如果仅仅是缓存一个表的信息,但是动用 cache 功能,同样是巨大的消耗。也就是说减少数据库 ... [/quote]



既然我已经把这一行放在 index.php中了,自然是对所有表的 table metadata 进行了缓存。。。。。。。。。

[color=red]但是如果仅仅是缓存一个表的信息,但是动用 cache 功能,同样是巨大的消耗。???[/color]难道每个Request中你都要用到 100 张表?:L

缓存对每个用户请求来说都只会缓存几张表而已。。。。。

2007-7-18 12:47 wps2000
我从来没有指望过使用Zend Framework后会变快的哦:lol

只不过效率十倍的下降是无法接受的

2007-7-19 11:02 mikespook
那要看是一个什么样的系统,在我们的程序里每个 request 用到个 20、30 张表也是普通的情况~~~

主要是 cache 到底消耗了多少性能~~~缓存能解决一部分性能,但是同时也带来另一部分负载~~~如果不能抵消,那就会很慢~~~

特别是用文件的 cache 方式~~磁盘 IO、对象序列化这些都不是什么善主~~所以并不是缓存就一定快~~所以效率下降应该是一种可能的情况,而不是无法接受的情况。只是没用对地方,或者得不偿失~~

PS:不过我是不用Db_Table,并没有提升多少方便性,反而很难维护~~~毕竟没有自动维护工具,表关系这里维护起来就很困难。编写关系映射需要头脑清晰,同时调试也是个大麻烦。确定是自己的问题,还是框架本身的 bug 非常艰难。

2007-7-19 13:18 wps2000
[quote]不过我是不用Db_Table,并没有提升多少方便性,反而很难维护~~~毕竟没有自动维护工具,表关系这里维护起来就很困难。编写关系映射需要头脑清晰,同时调试也是个大麻烦。确定是自己的问题,还是框架本身的 bug 非常艰难。[/quote]

的确,Zend_Db_Table简直就是一个鸡肋!

不过Zend_Db还行,差不多可以代替ADODB

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.