Google App Engine数据库的取数性能测试
2009 2 22 10:54 PM 2247次查看
分类:Google App Engine 标签:Google App Engine, Python, 性能
进行测试的是我的一个聊天室程序,里面有843条记录:
import time
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
class Message(db.Model):
id = db.IntegerProperty()
author = db.UserProperty()
content = db.StringProperty(multiline=True)
time = db.DateTimeProperty(auto_now_add=True)
class MainPage(webapp.RequestHandler):
def get(self, type):
print ''
if type == '0':
t = time.time()
print Message.all().count(), time.time() - t
if type == '1':
t = time.time()
print len(Message.all().fetch(1000)), time.time() - t
elif type == '2':
c = 0
t = time.time()
for message in Message.all():
c += 1
print c, time.time() - t
elif type == '3':
t = time.time()
print Message.all().count(), time.time() - t
elif type == '4':
t = time.time()
print len(Message.all().fetch(10)), time.time() - t
elif type == '5':
t = time.time()
print len(Message.all().fetch(10, 500)), time.time() - t
elif type == '6':
t = time.time()
print len(Message.all().fetch(100)), time.time() - t
else:
t = time.time()
print len(Message.all().fetch(100, 500)), time.time() - t
application = webapp.WSGIApplication([('/test(.*)', MainPage),])
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
为了节省时间,我就直接写print了,写了那么多个t = time.time(),也是为了避免if判断时的时间损失。为了避免第一次运行时编译造成时间增加,我将所有url访问了2遍,然后取第2次测试的结果。
结果如下:
/test1: Request Time: 722ms | Cpu Time: 12460ms | DB Time: 0.677840232849s分析如下:
/test2: Request Time: 1807ms | Cpu Time: 12433ms | DB Time: 1.73236489296s
/test3: Request Time: 351ms | Cpu Time: 1050ms | DB Time: 0.29713511467s
/test4: Request Time: 123ms | Cpu Time: 174ms | DB Time: 0.0722699165344s
/test5: Request Time: 369ms | Cpu Time: 177ms | DB Time: 0.300693035126s
/test6: Request Time: 117ms | Cpu Time: 1506ms | DB Time: 0.0991239547729s
/test7: Request Time: 213ms | Cpu Time: 1477ms | DB Time: 0.135269880295s
1.fetch的速度惨不忍睹,居然占用了12s的CPU时间。(这个是以Intel 1.2GHz CPU为标准的。)
2.迭代就更惨了,数据库时间多花了1s。
3.count的速度比fetch和迭代快了不少,但800多条就用了将近0.3秒的数据库时间,仍然不够理想。整个CPU时间也达到了1s,显示为警告。
4.取10条记录的时间还是过得去的,一般分页也就这么多。
5.加了个500的偏移量后,DB时间猛增3倍,响应时间增加2倍,属于不可接受的性能。
6.取100条记录居然没比取10条记录慢,我有点不敢相信。重新测试了几次,发现DB时间大都在0.1~0.12秒之间,并不是太慢。但是CPU时间却用了很多。
7.再加500偏移量,响应时间几乎慢了一倍。
由此可见:
1.很有必要自己维护一个counter,无论是放在数据库还是memcache里。当以后添加计划任务时,还可让其自动检查是否counter有误。
2.除非记录条数很少,否则别轻易使用fetch的offset参数。尽量使用过滤器来定位。
3.一次别处理太多数据,10条一般是可以接受的。
向下滚动可载入更多评论,或者点这里禁止自动加载。