1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
#!/usr/bin/env python
"""
Profile the permessage-deflate extension.
Usage::
$ pip install line_profiler
$ python experiments/compression/corpus.py experiments/compression/corpus
$ PYTHONPATH=src python -m kernprof \
--line-by-line \
--prof-mod src/websockets/extensions/permessage_deflate.py \
--view \
experiments/profiling/compression.py experiments/compression/corpus 12 5 6
"""
import pathlib
import sys
from websockets.extensions.permessage_deflate import PerMessageDeflate
from websockets.frames import OP_TEXT, Frame
def compress_and_decompress(corpus, max_window_bits, memory_level, level):
extension = PerMessageDeflate(
remote_no_context_takeover=False,
local_no_context_takeover=False,
remote_max_window_bits=max_window_bits,
local_max_window_bits=max_window_bits,
compress_settings={"memLevel": memory_level, "level": level},
)
for data in corpus:
frame = Frame(OP_TEXT, data)
frame = extension.encode(frame)
frame = extension.decode(frame)
if __name__ == "__main__":
if len(sys.argv) < 2 or not pathlib.Path(sys.argv[1]).is_dir():
print(f"Usage: {sys.argv[0]} <directory> [<max_window_bits>] [<mem_level>]")
corpus = [file.read_bytes() for file in pathlib.Path(sys.argv[1]).iterdir()]
max_window_bits = int(sys.argv[2]) if len(sys.argv) > 2 else 12
memory_level = int(sys.argv[3]) if len(sys.argv) > 3 else 5
level = int(sys.argv[4]) if len(sys.argv) > 4 else 6
compress_and_decompress(corpus, max_window_bits, memory_level, level)
|