From f3a2e1bd2c8428c3b85263db80b88dfc335646dd Mon Sep 17 00:00:00 2001 From: Fabien MARTY Date: Mon, 5 Jun 2023 11:31:33 +0200 Subject: [PATCH] better benchmark script and add bench results --- README.md | 28 +++++++++++++++++++++++---- bench.png | Bin 0 -> 72832 bytes bench.py | 54 +++++++++++++++++++++++++++++++++-------------------- bench2.png | Bin 0 -> 58535 bytes 4 files changed, 58 insertions(+), 24 deletions(-) create mode 100644 bench.png create mode 100644 bench2.png diff --git a/README.md b/README.md index 89123a6..1cdfbdb 100644 --- a/README.md +++ b/README.md @@ -19,16 +19,36 @@ More details on [this Wikepedia article](https://en.wikipedia.org/wiki/Fowler%E2 ## Features -- speed: **4 000%** faster than basic Python implementation, **40%** faster than `pyhash` +- speed: + - up to **800 MB/s** hashing speed *(on Macbook Pro M1 (2020) with `fnv0_64`)* + - **6 800%** faster than basic Python implementation, **70%** faster than `pyhash` *(when hashing 100 bytes with `fnv0_64` on a cloud VM)* - portability: - tested with recent Python versions (3.7+) - compatible with ARM64 - - compatible with PyPy + - compatible (and tested) with PyPy ## Non features -- other hash algorithms (this library is only about FNV algorithm) -- too agressive CPU optimizations (we prefer maximizing binary portability) +- other hash algorithms *(this library is only about FNV algorithm)* +- too agressive CPU optimizations *(we prefer maximizing binary portability)* + +## Benchmark + +You have a benchmark script [here](bench.py) to bench `fnv-c` by yourself and to compare it with: +- [`fnvhash`](https://github.com/znerol/py-fnvhash) (pure python implementation) +- [`pyhash`](https://github.com/flier/pyfasthash) (more general hashing library with C++ extension) + +### Comparisons with other libraries (`fnv0_64` on a cloud VM) + +Differences with `fnvhash` are huge (from **35%** for one byte hashing to **19 000%** for 1 000 bytes hashing with `fnv0_64`) + +Differences with `pyhash` (on `fnv0_64`) are shown with the following diagram: + +![](bench.png) + +### Influence of string size on `fnv-c` hashing speed (on a Macbook Pro M1 (2020) with `fnv0_64`) + +![](bench2.png) ## How to install/use it? diff --git a/bench.png b/bench.png new file mode 100644 index 0000000000000000000000000000000000000000..222cbfd471d9b9634cbaf1be83be4f37ff1ce4d6 GIT binary patch literal 72832 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 literal 0 HcmV?d00001 diff --git a/bench.py b/bench.py index 471878a..99a859c 100644 --- a/bench.py +++ b/bench.py @@ -1,18 +1,30 @@ +import platform import timeit -SIZES = (1, 10, 100, 1000) -STMTS = ("fnv0_32", "fnv0_64", "fnv1_32", "fnv1_64", "fnv1a_32", "fnv1a_64") +BENCH_PYHASH = True +BENCH_FNVHASH = True -TOBENCHS = [ - { - "project": "fnv_c", - "import": "fnv_c", - }, - { - "project": "fnvhash", - "import": "fnvhash", - }, -] +SIZES = (1, 5, 10, 50, 100, 500, 1000) + +if BENCH_PYHASH and platform.machine() == "arm64": + print("WARNING: pyhash is not compatible with ARM64") + BENCH_PYHASH = False + +if BENCH_FNVHASH: + try: + pass + except ImportError: + print("WARNING: fnvhash is not installed") + print("=> do 'pip install fnvhash'") + BENCH_FNVHASH = False + +if BENCH_PYHASH: + try: + pass + except ImportError: + print("WARNING: pyhash is not installed") + print("=> do 'pip install pyhash'") + BENCH_PYHASH = False def bench(imprt, hasher): @@ -36,11 +48,13 @@ def bench(imprt, hasher): return timeit.timeit(stmt="hasher(b)", setup=setup) -for stmt in STMTS: - for size in SIZES: - print(f">>> Benchmarking (1M times) {stmt} on bytes of size {size}...") - print("") - for tobench in TOBENCHS: - print(f"{tobench['project']:10}", bench(tobench["import"], stmt)) - print("") - print("") +for size in SIZES: + print(f">>> Benchmarking (1M times) on bytes of size {size}...") + print("") + print("fnv0_64 (fnv-c) ", bench("fnv_c", "fnv0_64")) + if BENCH_PYHASH: + print("fnv0_64 (pyhash) ", bench("pyhash", "fnv1_64()")) + if BENCH_FNVHASH: + print("fnv0_64 (fnvhash) ", bench("fnvhash", "fnv0_64")) + print("") + print("") diff --git a/bench2.png b/bench2.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbe805b43f37f65393a4d0607f5014d08e784fc GIT binary patch literal 58535 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 literal 0 HcmV?d00001