def _measure_scaling(self, create_n, measured_resource, scaled_resource = None):
"""
:param create_n: Function to create N of scaled_resource
:param measured_resource: The resource we will measure the query load for
:param scaled_resource: The object which is actually being scaled with N
:return: Instance of Order1, OrderN, OrderBad
"""
if scaled_resource is None:
scaled_resource = measured_resource
query_counts = {}
samples = [5, 6, 7, 8]
for n in samples:
ObjectCache.clear()
create_n(n)
# Queries get reset at the start of a request
self.assertEqual(scaled_resource._meta.queryset.count(), n)
response = self.api_client.get("/api/%s/" % measured_resource._meta.resource_name, data = {'limit': 0})
self.assertEqual(response.status_code, 200, "%s:%s" % (response.content, measured_resource._meta.resource_name))
query_count = len(connection.queries)
self.assertEqual(len(self.deserialize(response)['objects']), measured_resource._meta.queryset.count())
query_counts[n] = query_count
# Ignore samples[0], it was just to clear out any setup overhead from first call to API
# gradient between samples[1] and samples[2]
grad1 = (query_counts[samples[2]] - query_counts[samples[1]]) / (samples[2] - samples[1])
# gradient between samples[2] and samples[3]
grad2 = (query_counts[samples[3]] - query_counts[samples[2]]) / (samples[3] - samples[2])
if grad1 == 0 and grad2 == 0:
# Hoorah, O(1)
return Order1(query_counts[samples[3]])
elif grad1 > 0 and grad1 == grad2:
# O(N)
return OrderN(grad1)
else:
# Worse than O(N)
return OrderBad()
test_query_scaling.py 文件源码
python
阅读 20
收藏 0
点赞 0
评论 0
评论列表
文章目录