mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 00:45:18 +03:00
ab3a7cb21f
Summary: In preparation for merging fb-mercurial sources to the Eden repository, move everything from the top-level directory into an `eden/scm` subdirectory.
72 lines
2.4 KiB
Python
Executable File
72 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# Copyright 2018 Facebook, Inc.
|
|
#
|
|
# This software may be used and distributed according to the terms of the
|
|
# GNU General Public License version 2 or any later version.
|
|
from __future__ import absolute_import
|
|
|
|
import functools
|
|
import os
|
|
import struct
|
|
import timeit
|
|
|
|
import lz4 as pylz4
|
|
from bindings import lz4 as rustlz4
|
|
|
|
|
|
def roundtrip(size=None):
|
|
if size is None:
|
|
size = struct.unpack(">I", b"\0" + os.urandom(3))[0]
|
|
data = os.urandom(size)
|
|
assert rustlz4.decompress(pylz4.compress(data)) == data
|
|
assert pylz4.decompress(buffer(rustlz4.compress(data))) == data
|
|
assert rustlz4.decompress(pylz4.compressHC(data)) == data
|
|
assert pylz4.decompress(buffer(rustlz4.compresshc(data))) == data
|
|
|
|
|
|
def benchmark(data, hcdata=None):
|
|
number = 100
|
|
size = len(data)
|
|
hcdata = hcdata or data
|
|
|
|
for modname, func in [("pylz4", pylz4.compress), ("rustlz4", rustlz4.compress)]:
|
|
timer = timeit.Timer(functools.partial(func, data))
|
|
elapsed = timer.timeit(number=number)
|
|
perf = size * number / elapsed / 1e6
|
|
name = "%s.%s" % (modname, func.__name__)
|
|
print("%24s: %8.2f MB/s" % (name, perf))
|
|
|
|
for modname, func in [("pylz4", pylz4.compressHC), ("rustlz4", rustlz4.compresshc)]:
|
|
timer = timeit.Timer(functools.partial(func, hcdata))
|
|
elapsed = timer.timeit(number=number)
|
|
perf = size * number / elapsed / 1e6
|
|
name = "%s.%s" % (modname, func.__name__)
|
|
print("%24s: %8.2f MB/s" % (name, perf))
|
|
|
|
data = pylz4.compress(data)
|
|
for modname, func in [("pylz4", pylz4.decompress), ("rustlz4", rustlz4.decompress)]:
|
|
timer = timeit.Timer(functools.partial(func, data))
|
|
elapsed = timer.timeit(number=number)
|
|
perf = size * number / elapsed / 1e6
|
|
name = "%s.%s" % (modname, func.__name__)
|
|
print("%24s: %8.2f MB/s" % (name, perf))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
size = int(2e7)
|
|
print("Benchmarking (easy to compress data)...")
|
|
benchmark(b"\0" * size)
|
|
print("Benchmarking (hard to compress data)...")
|
|
benchmark(os.urandom(size), hcdata=os.urandom(size / 100))
|
|
|
|
print("Testing roundtrips (Press Ctrl+C to stop)...")
|
|
for i in range(256):
|
|
roundtrip(i)
|
|
tested = 0
|
|
while True:
|
|
tested += 1
|
|
roundtrip(0)
|
|
if tested % 100000 == 0:
|
|
os.write(1, "\r %d test cases passed" % tested)
|