django-polymorphic/example/pexp/management/commands/polybench.py

119 lines
2.7 KiB
Python

# -*- coding: utf-8 -*-
"""
This module is a scratchpad for general development, testing & debugging
"""
import sys
import time
from pprint import pprint
from django.core.management import BaseCommand
from django.db import connection
from pexp.models import *
num_objects = 1000
def show_queries():
print()
print("QUERIES:", len(connection.queries))
pprint(connection.queries)
print()
connection.queries_log.clear()
###################################################################################
# benchmark wrappers
def print_timing(func, message="", iterations=1):
def wrapper(*arg):
results = []
connection.queries_log.clear()
for i in range(iterations):
t1 = time.time()
x = func(*arg)
t2 = time.time()
results.append((t2 - t1) * 1000.0)
res_sum = 0
for r in results:
res_sum += r
median = res_sum / len(results)
print(
"%s%-19s: %.0f ms, %i queries"
% (message, func.func_name, median, len(connection.queries) / len(results))
)
sys.stdout.flush()
return wrapper
def run_vanilla_any_poly(func, iterations=1):
f = print_timing(func, " ", iterations)
f(NormalModelC)
f = print_timing(func, "poly ", iterations)
f(TestModelC)
###################################################################################
# benchmarks
def bench_create(model):
for i in range(num_objects):
model.objects.create(
field1="abc" + str(i), field2="abcd" + str(i), field3="abcde" + str(i)
)
# print 'count:',model.objects.count()
def bench_load1(model):
for o in model.objects.all():
pass
def bench_load1_short(model):
for i in range(num_objects / 100):
for o in model.objects.all()[:100]:
pass
def bench_load2(model):
for o in model.objects.all():
f1 = o.field1
f2 = o.field2
f3 = o.field3
def bench_load2_short(model):
for i in range(num_objects / 100):
for o in model.objects.all()[:100]:
f1 = o.field1
f2 = o.field2
f3 = o.field3
def bench_delete(model):
model.objects.all().delete()
###################################################################################
# Command
class Command(BaseCommand):
help = ""
def handle_noargs(self, **options):
func_list = [
(bench_delete, 1),
(bench_create, 1),
(bench_load1, 5),
(bench_load1_short, 5),
(bench_load2, 5),
(bench_load2_short, 5),
]
for f, iterations in func_list:
run_vanilla_any_poly(f, iterations=iterations)