summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelmut Grohne <helmut@subdivi.de>2021-12-29 21:00:04 +0100
committerHelmut Grohne <helmut@subdivi.de>2021-12-29 21:00:04 +0100
commit69a8861b704c969260ecb55110d8e41cd9aaf0a7 (patch)
treebc508bc46be90509978ddb2e7fb77b630a21be80
parente118de84d60e6f0d7662dcbb6aa362f452dda6ba (diff)
downloaddebian-dedup-69a8861b704c969260ecb55110d8e41cd9aaf0a7.tar.gz
webapp: speed up encode_and_buffer
We now know that our parameter is a jinja2.environment.TemplateStream. Enable buffering and accumulate via an io.BytesIO to avoid O(n^2) append.
-rwxr-xr-xwebapp.py20
1 files changed, 11 insertions, 9 deletions
diff --git a/webapp.py b/webapp.py
index 9993cb0..d91d724 100755
--- a/webapp.py
+++ b/webapp.py
@@ -3,6 +3,7 @@
import argparse
import contextlib
import datetime
+import io
import sqlite3
from wsgiref.simple_server import make_server
@@ -49,15 +50,16 @@ hash_template = jinjaenv.get_template("hash.html")
index_template = jinjaenv.get_template("index.html")
source_template = jinjaenv.get_template("source.html")
-def encode_and_buffer(iterator):
- buff = b""
- for elem in iterator:
- buff += elem.encode("utf8")
- if len(buff) >= 2048:
- yield buff
- buff = b""
- if buff:
- yield buff
+def encode_and_buffer(stream):
+ stream.enable_buffering(16)
+ buff = io.BytesIO()
+ for elem in stream:
+ buff.write(elem.encode("utf8"))
+ if buff.tell() >= 2048:
+ yield buff.getvalue()
+ buff = io.BytesIO()
+ if buff.tell() > 0:
+ yield buff.getvalue()
def html_response(unicode_iterator, max_age=24 * 60 * 60):
resp = Response(encode_and_buffer(unicode_iterator), mimetype="text/html")