Files
kefu/deploy/knowledge-v4-review/benchmark.py
T
2026-09-21 10:34:06 +08:00

45 lines
2.7 KiB
Python

"""Bounded-memory synthetic 500,000-draft snapshot benchmark, no external services."""
from pathlib import Path
import sys, time, json, tempfile, tracemalloc
sys.path.insert(0, str(Path(__file__).resolve().parents[2]/'wechat_rpa'))
from test_knowledge_review import FullReviewTest
from knowledge_review import KnowledgeReviewStore, KnowledgeReviewWorker
fixture = FullReviewTest(); fixture.setUp()
try:
seed = fixture.seed(1)[0]
started = time.monotonic()
with fixture.db.connect() as db:
# SQL generates the fixture; no Python array of all knowledge items.
db.execute('''WITH RECURSIVE n(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM n WHERE i<499999)
INSERT INTO knowledge_item(id,tenant_id,job_id,dedup_hash,title,question,answer,conditions,
category,kind,flags_json,status,revision,valid_until,created_at,updated_at)
SELECT printf('bench-%06d',n.i),k.tenant_id,k.job_id,printf('bench-%06d',n.i),k.title,k.question,
k.answer,k.conditions,k.category,k.kind,k.flags_json,k.status,k.revision,k.valid_until,k.created_at,k.updated_at
FROM n CROSS JOIN knowledge_item k WHERE k.id=?''', (seed,))
db.execute('''INSERT INTO knowledge_source SELECT k.id,s.message_id,s.version_no,s.role,s.content,s.sent_at
FROM knowledge_item k CROSS JOIN knowledge_source s WHERE k.id!=? AND s.item_id=?''', (seed,seed))
seeding = time.monotonic()-started
tracemalloc.start()
reviews = KnowledgeReviewStore(fixture.store)
started = time.monotonic(); job = reviews.preview('*', -1, fixture.actor, '')
preview_seconds = time.monotonic()-started
assert job['total'] == job['preview']['eligible'] == 500000, job
reviews.action(job['id'], 'start', fixture.actor, '', True)
worker = KnowledgeReviewWorker(fixture.store)
started = time.monotonic()
for _ in range(10):
worker.step()
batch_seconds = (time.monotonic()-started)/10
final = reviews.get(job['id'], fixture.actor)
assert final['approved'] == final['processed'] == 1000 and final['status']=='running'
assert fixture.store.stats('default') == {'approved':1000,'draft':499000}
result = {'synthetic_drafts':500000,'seeding_seconds':round(seeding,3),
'preview_seconds':round(preview_seconds,3),'average_100_item_batch_seconds':round(batch_seconds,3),
'processed':final['processed'],'python_peak_mb':round(tracemalloc.get_traced_memory()[1]/1024**2,3),
'preview_response_bytes':len(json.dumps(job).encode()),'published':0}
tracemalloc.stop()
(Path(__file__).parent/'benchmark.json').write_text(json.dumps(result,indent=2),encoding='utf-8')
print(json.dumps(result),flush=True)
finally:
fixture.tearDown()