Crates.io | atomic-hyperloglog |
lib.rs | atomic-hyperloglog |
version | 0.1.0 |
source | src |
created_at | 2023-07-07 04:20:38.84238 |
updated_at | 2023-07-07 04:20:38.84238 |
description | thread-safe hyperloglog, with atomics |
homepage | https://github.com/benaubin/hyperloglog |
repository | https://github.com/benaubin/hyperloglog |
max_upload_size | |
id | 910497 |
size | 26,183 |
a concurrent, super fast, pretty-well-tested and fully safe hyperloglog for rust with no dependencies.
on my m1 macbook pro, there is no overhead to concurrency (only uses relaxed ordering), so it is not configurable feature.
you know, concurrency that just works. its pretty magic.
performance:
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| b | num_threads | elements_per_thread | duration | est. cardinality | error | z score |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 12 | 1 | 80000000 | 0.783505583 | 81407162.3289801 | 0.017589529112251288 | 1.0824325607539254 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 12 | 2 | 40000000 | 0.392236 | 81407162.3289801 | 0.017589529112251288 | 1.0824325607539254 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 12 | 8 | 10000000 | 0.115582916 | 81407162.3289801 | 0.017589529112251288 | 1.0824325607539254 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 12 | 8 | 200000000 | 2.054057208 | 1585805566.3940902 | -0.00887152100369364 | -0.5459397540734547 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 12 | 16 | 200000000 | 3.7321913330000003 | 3227717320.617457 | 0.008661662692955286 | 0.533025396489556 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 16 | 16 | 200000000 | 3.728134916 | 3198889302.695715 | -0.00034709290758907796 | -0.08543825417577304 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 8 | 16 | 200000000 | 3.6748197080000002 | 2962602353.834109 | -0.074186764426841 | -1.1413348373360153 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 4 | 16 | 200000000 | 3.756755708 | 4388265829.463295 | 0.3713330717072797 | 1.4282041219510757 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 4 | 8 | 10000000 | 0.100113625 | 85015087.94729412 | 0.06268859934117645 | 0.24110999746606324 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 4 | 2 | 40000000 | 0.390384833 | 85015087.94729412 | 0.06268859934117645 | 0.24110999746606324 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 4 | 1 | 80000000 | 0.779172958 | 85015087.94729412 | 0.06268859934117645 | 0.24110999746606324 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
| 4 | 2 | 80000000 | 0.785492541 | 208090923.9294848 | 0.3005682745592801 | 1.1560318252280004 |
+----+-------------+---------------------+--------------------+--------------------+-------------------------+----------------------+
memory usage:
the number of registers is configurable by b: m = 2^b
5 registers are stored in 32 bits.
2^b / 5 * 4 gives the bytes of memory used