我正在尝试优化视图模板渲染。此刻我有这样的图片:
如你所见:
SQL timing
持续 ~0.5秒,
TemplateTiming
~2秒,
但是Total Time
差不多9秒!
此外,我的视图中有一个计时器 - 它显示视图工作的 ~0.6秒。当视图打印出“已完成”时 - 在我看到此页面渲染在浏览器中完成后会花费很多时间。
有人可以解释我从哪里到9-0.5-2-0.6 = 5.9秒来自哪里?
我有很长的列表要渲染,分页,~12k项目。如果项目数量较小 - 渲染时间也较短。有时我也会使用~20k项目列表呈现此页面,但使用另一个查询/过滤器组合 - 总时间要小得多~4~5秒。出了什么问题,什么时候出现?
更新看起来我已经找到问题的原因,但我仍然无法得到错误。我认为我有这段代码:
#1st definition of products_list
products_list = Product.objects.select_related('shop', 'brand', 'sale', 'promo', 'category') \
.only('product_id', 'title', 'slug', 'product_url',
'price', 'prev_price', 'brand',
'sale__percent', 'sale__old_price',
'promo__promo_description', 'promo__promo_url',
'shop__shop_name', 'shop__country',
'category__category_name')\
.filter(in_stock = True)
if sale != None:
cached_shop = cache.get(shop)
if cached_shop != None:
#2nd definition, replaces products_list
products_list = Product.objects.select_related('shop', 'brand', 'sale', 'promo', 'category').filter(product_id__in=cached_shop[sale]) #PRODUCS_LIST
else:
#this piece of code uses 1st definition of products_list
if sale == "19%":
products_list = products_list.filter(sale__percent__gt=0, sale__percent__lt=20)
elif sale == "20%-49%":
products_list = products_list.filter(sale__percent__gte=20, sale__percent__lt=50)
elif sale == "50%-69%":
products_list = products_list.filter(sale__percent__gte=50, sale__percent__lt=70)
elif sale == "70%-89%":
products_list = products_list.filter(sale__percent__gte=70, sale__percent__lt=90)
elif sale == "90%+":
products_list = products_list.filter(sale__percent__gte=90)
如您所见,它试图在缓存中找到product.id列表,如果找不到缓存 - 它会直接过滤Product表。但是如果我删除缓存条件 - 速度会急剧下降,几乎是2倍 - 图2 。
为什么会这样?我看到,当我使用缓存时,SQL timings
更低比使用标准过滤时,但Total timings
是 2倍!我正在努力实现更好的事情,但结果会更糟。