diff --git a/.github/workflows/test_ci.yml b/.github/workflows/test_ci.yml index 2363113..b38820b 100644 --- a/.github/workflows/test_ci.yml +++ b/.github/workflows/test_ci.yml @@ -40,6 +40,7 @@ jobs: toolchain: ${{ matrix.rust }} - name: Build and Test on ${{ matrix.os }} with Rust ${{ matrix.rust }} + if: matrix.os != 'windows-latest' || matrix.rust != '1.89.0' run: make test - name: Run examples on ${{ matrix.os }} with Rust ${{ matrix.rust }} diff --git a/Cargo.lock b/Cargo.lock index 8364a60..051f403 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,24 +2,84 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "anstyle" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + [[package]] name = "bitflags" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "clap" version = "4.5.38" @@ -37,7 +97,6 @@ checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120" dependencies = [ "anstyle", "clap_lex", - "terminal_size", ] [[package]] @@ -47,10 +106,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] -name = "condtype" -version = "1.3.0" +name = "criterion" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" +checksum = "e1c047a62b0cc3e145fa84415a3191f628e980b194c2755aa12300a4e6cbd928" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" +dependencies = [ + "cast", + "itertools", +] [[package]] name = "crossbeam-deque" @@ -78,56 +164,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] -name = "divan" -version = "0.1.21" +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "getrandom" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a405457ec78b8fe08b0e32b4a3570ab5dff6dd16eb9e76a5ee0a9d9cbd898933" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", - "clap", - "condtype", - "divan-macros", "libc", - "regex-lite", + "r-efi", + "wasi", ] [[package]] -name = "divan-macros" -version = "0.1.21" +name = "half" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9556bc800956545d6420a640173e5ba7dfa82f38d3ea5a167eb555bc69ac3323" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ - "proc-macro2", - "quote", - "syn", + "cfg-if", + "crunchy", ] [[package]] -name = "either" -version = "1.15.0" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] [[package]] -name = "errno" -version = "0.3.12" +name = "itoa" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" -dependencies = [ - "libc", - "windows-sys", -] +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] -name = "getrandom" -version = "0.3.3" +name = "js-sys" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi", + "once_cell", + "wasm-bindgen", ] [[package]] @@ -137,10 +229,65 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] -name = "linux-raw-sys" -version = "0.9.4" +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "memchr" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] [[package]] name = "ppv-lite86" @@ -225,31 +372,105 @@ dependencies = [ ] [[package]] -name = "regex-lite" -version = "0.1.6" +name = "regex" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "rlnc" -version = "0.8.5" +version = "0.8.6" dependencies = [ - "divan", + "criterion", "rand", "rayon", ] [[package]] -name = "rustix" -version = "1.0.7" +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", ] [[package]] @@ -264,13 +485,13 @@ dependencies = [ ] [[package]] -name = "terminal_size" -version = "0.4.2" +name = "tinytemplate" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ - "rustix", - "windows-sys", + "serde", + "serde_json", ] [[package]] @@ -279,6 +500,16 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "wasi" version = "0.14.2+wasi-0.2.4" @@ -288,6 +519,84 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + [[package]] name = "windows-sys" version = "0.59.0" diff --git a/Cargo.toml b/Cargo.toml index d686e53..181a138 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rlnc" -version = "0.8.5" +version = "0.8.6" edition = "2024" resolver = "3" rust-version = "1.89.0" @@ -23,8 +23,13 @@ categories = ["network-programming", "encoding", "algorithms"] rand = "=0.9.2" rayon = { version = "=1.10.0", optional = true } -[dev-dependencies] -divan = "=0.1.21" +[target.'cfg(target_family = "wasm")'.dev-dependencies] +criterion = { version = "=0.7.0", features = [ + "html_reports", +], default-features = false } + +[target.'cfg(not(target_family = "wasm"))'.dev-dependencies] +criterion = { version = "=0.7.0", features = ["html_reports"] } [features] parallel = ["dep:rayon"] diff --git a/Makefile b/Makefile index 2f66a57..2d6c975 100644 --- a/Makefile +++ b/Makefile @@ -31,13 +31,21 @@ coverage: ## Generates HTML code coverage report, using `cargo-tarpaulin` cargo tarpaulin -t 600 --profile test-release --out Html .PHONY: bench -bench: ## Run all benchmarks - RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized - RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --features parallel +bench: ## Run all benchmarks in single-threaded mode + RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --bench full_rlnc_encoder + RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --bench full_rlnc_recoder + RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --bench full_rlnc_decoder + +.PHONY: bench_parallel +bench_parallel: ## Run all benchmarks in multi-threaded mode + RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --features parallel --bench full_rlnc_encoder + RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --features parallel --bench full_rlnc_recoder + RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --features parallel --bench full_rlnc_decoder .PHONY: clean -clean: ## Removes cargo target directory +clean: ## Removes cargo target and Python virtual environment directory cargo clean + rm -rf $(VENV) .PHONY: example example: ## Runs the Full RLNC example program @@ -48,3 +56,51 @@ example: ## Runs the Full RLNC example program example-wasm: ## Runs the Full RLNC example program in WASM environment cargo run --example full_rlnc --target wasm32-wasip1 --no-default-features cargo run --example full_rlnc --target wasm32-wasip2 --no-default-features + +# ----------------------------------------------------------------------------- +# Following Make recipes are for easy plotting of benchmark run data, in JSONL format, on Linux or Mac machines. +# Plotting is done using Matplotlib library. Plotted images are placed inside the ./plots directory. + +# Define Virtual environment state directory along with path to executables inside venv +VENV := .venv +VENV_PYTHON := $(VENV)/bin/python +VENV_PIP := $(VENV)/bin/pip + +OS := $(shell uname -s) +CPU_NAME := $(shell if [ "$(OS)" = "Darwin" ]; then sysctl -n machdep.cpu.brand_string | tr ' ' '_' | tr -d '()'; elif [ "$(OS)" = "Linux" ]; then grep "model name" /proc/cpuinfo | uniq | cut -d: -f2 | sed 's/^[ \t]*//' | tr ' ' '_' | tr -d '()'; else echo "$(OS)" | tr ' ' '_' | tr -d '()'; fi) + +.PHONY: setup +setup: install ## Sets up virtual environment and installs dependencies + @echo "\nโœ… Virtual environment is ready." + @echo "To activate it, run: source $(VENV)/bin/activate" + @echo "After activated, to deactivate it, run: deactivate" + +# The install target now depends on the venv being created +.PHONY: install +install: $(VENV)/bin/activate ## Install dependencies using `pip` + @echo "Installing dependencies..." + $(VENV_PIP) install -r plots/scripts/requirements.txt + +# This target creates the virtual environment +$(VENV)/bin/activate: plots/scripts/requirements.txt + @echo "Setting up environment with venv..." + python3 -m venv $(VENV) + +.PHONY: bench_then_plot +bench_then_plot: setup ## Run benchmark, collect JSONL output and produce plot of benchmark throughput + RUSTFLAGS="-C target-cpu=native" cargo criterion --bench full_rlnc_encoder --message-format json | tee full_rlnc_encoder.jsonl &&\ + $(VENV_PYTHON) plots/scripts/plot_benchmark.py -u GB/s --title-format "{group_name} on $(CPU_NAME)" full_rlnc_encoder.jsonl &&\ + rm full_rlnc_encoder.jsonl &&\ + mv benchmark_encode.png plots/benchmark_encode_on_$(CPU_NAME)_with_$(shell rustc --version | tr ' ' '_' | tr -d '()').png &&\ + mv benchmark_encode_zero_alloc.png plots/benchmark_encode_zero_alloc_on_$(CPU_NAME)_with_$(shell rustc --version | tr ' ' '_' | tr -d '()').png + + RUSTFLAGS="-C target-cpu=native" cargo criterion --bench full_rlnc_recoder --message-format json | tee full_rlnc_recoder.jsonl &&\ + $(VENV_PYTHON) plots/scripts/plot_benchmark.py -u GB/s --title-format "{group_name} on $(CPU_NAME)" full_rlnc_recoder.jsonl &&\ + rm full_rlnc_recoder.jsonl &&\ + mv benchmark_recode.png plots/benchmark_recode_on_$(CPU_NAME)_with_$(shell rustc --version | tr ' ' '_' | tr -d '()').png &&\ + mv benchmark_recode_zero_alloc.png plots/benchmark_recode_zero_alloc_on_$(CPU_NAME)_with_$(shell rustc --version | tr ' ' '_' | tr -d '()').png + + RUSTFLAGS="-C target-cpu=native" cargo criterion --bench full_rlnc_decoder --message-format json | tee full_rlnc_decoder.jsonl &&\ + $(VENV_PYTHON) plots/scripts/plot_benchmark.py --title-format "{group_name} on $(CPU_NAME)" full_rlnc_decoder.jsonl &&\ + rm full_rlnc_decoder.jsonl &&\ + mv benchmark_decode.png plots/benchmark_decode_on_$(CPU_NAME)_with_$(shell rustc --version | tr ' ' '_' | tr -d '()').png diff --git a/README.md b/README.md index c7d63f0..e3addd1 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,13 @@ Blazing Fast Erasure-Coding with Random Linear Network Coding (RLNC) `rlnc` is a Rust library crate that implements an advanced erasure-coding technique Random Linear Network Coding (RLNC) over galois field $GF(2^8)$ with irreducible polynomial $x^8 + x^4 + x^3 + x + 1$. This library provides functionalities for blazing fast erasure-coding of data, reconstructing original data from coded pieces, and recoding existing coded pieces to new erasure-coded pieces, without ever decoding it back to original data. It performs runtime introspection of platform and uses the best of GFNI, AVX512, AVX2 and SSSE3 intrinsics on `x86_64` and NEON intrinsics on `arm64`, for fast vector multiplication by a single scalar over $GF(2^8)$. -Following charts show performance of RLNC encoder, recoder and decoder on **AWS EC2 `m7a.large` with AMD EPYC 9R14** - which has GFNI + AVX512 support. More performance benchmark results [below](#benchmarking). +Following charts show performance of RLNC encoder, recoder and decoder on **AWS EC2 `m7a.large` with AMD EPYC 9R14** - which has GFNI + AVX512 support. More on performance benchmarking [below](#benchmarking). -![rlnc-encoder-on-x86_64_with-amd-gfni](./plots/rlnc-encoder-on-x86_64_with-amd-gfni.png) +![rlnc-encoder-on-x86_64_with-amd-gfni](./plots/benchmark_encode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png) -![rlnc-recoder-on-x86_64_with-amd-gfni](./plots/rlnc-recoder-on-x86_64_with-amd-gfni.png) +![rlnc-recoder-on-x86_64_with-amd-gfni](./plots/benchmark_recode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png) -![rlnc-decoder-on-x86_64_with-amd-gfni](./plots/rlnc-decoder-on-x86_64_with-amd-gfni.png) +![rlnc-decoder-on-x86_64_with-amd-gfni](./plots/benchmark_decode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png) --- **Let's take a practical example of how RLNC can be useful.** @@ -144,13 +144,18 @@ Performance benchmarks for several input configurations are included to evaluate To run the benchmarks, execute the following command from the root of the project: ```bash -make bench # First with `default` feature, then with `parallel` feature enabled. +make bench # Runs with `default` feature +make bench_parallel # Runs with `parallel` feature ``` > [!WARNING] > When benchmarking make sure you've disabled CPU frequency scaling, otherwise numbers you see can be misleading. I find helpful. -For visualizing benchmark results see [plots](./plots) directory. +For visualizing benchmark results, run following command, which will produce PNG figures inside [./plots](./plots/) directory. + +```bash +make bench_then_plot # Only runs with `default` features enabled +``` ### On 12th Gen Intel(R) Core(TM) i7-1260P @@ -164,3630 +169,15 @@ Full RLNC Decoder | **1.59 GiB/s** | **Doesn't yet implement a parallel decoding In summary, the full RLNC implementation demonstrates excellent encoding and recoding speeds, consistently achieving GiB/s throughputs with minimal sensitivity to the number of data pieces. The `parallel` feature, leveraging Rust `rayon` data-parallelism framework, also provides good performance for both encoding and recoding. Whether you want to use that feature, completely depends on your usecase. However, decoding remains a much slower operation, with its performance significantly diminishing as the data is split into a greater number of pieces, and currently does **not** implement a parallel decoding algorithm. -
-Click to view detailed benchmark results ๐Ÿ‘‡ - -#### Full RLNC Encoder - -```bash -# Encoding with AVX2-powered SIMD vector x scalar multiplication - -Timer precision: 22 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 32.89 ยตs โ”‚ 127.4 ยตs โ”‚ 40.52 ยตs โ”‚ 41.51 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 31.54 GiB/s โ”‚ 8.141 GiB/s โ”‚ 25.6 GiB/s โ”‚ 24.99 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 41.24 ยตs โ”‚ 56.61 ยตs โ”‚ 43.1 ยตs โ”‚ 43.33 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 24.41 GiB/s โ”‚ 17.78 GiB/s โ”‚ 23.36 GiB/s โ”‚ 23.24 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 31.63 ยตs โ”‚ 43.55 ยตs โ”‚ 32.9 ยตs โ”‚ 33.61 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 31.36 GiB/s โ”‚ 22.77 GiB/s โ”‚ 30.14 GiB/s โ”‚ 29.51 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 35.49 ยตs โ”‚ 60.33 ยตs โ”‚ 36.4 ยตs โ”‚ 37.23 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.73 GiB/s โ”‚ 16.31 GiB/s โ”‚ 27.04 GiB/s โ”‚ 26.43 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 33.35 ยตs โ”‚ 41.93 ยตs โ”‚ 36.74 ยตs โ”‚ 36.01 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.4 GiB/s โ”‚ 23.39 GiB/s โ”‚ 26.69 GiB/s โ”‚ 27.23 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 1.034 ms โ”‚ 2.273 ms โ”‚ 1.094 ms โ”‚ 1.173 ms โ”‚ 100 โ”‚ 100 - โ”‚ 16.04 GiB/s โ”‚ 7.301 GiB/s โ”‚ 15.17 GiB/s โ”‚ 14.14 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 941.6 ยตs โ”‚ 1.658 ms โ”‚ 1.009 ms โ”‚ 1.027 ms โ”‚ 100 โ”‚ 100 - โ”‚ 17.11 GiB/s โ”‚ 9.713 GiB/s โ”‚ 15.96 GiB/s โ”‚ 15.67 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 965.5 ยตs โ”‚ 1.552 ms โ”‚ 1.009 ms โ”‚ 1.021 ms โ”‚ 100 โ”‚ 100 - โ”‚ 16.43 GiB/s โ”‚ 10.22 GiB/s โ”‚ 15.72 GiB/s โ”‚ 15.52 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 923.9 ยตs โ”‚ 1.534 ms โ”‚ 940.6 ยตs โ”‚ 956.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 17.04 GiB/s โ”‚ 10.26 GiB/s โ”‚ 16.74 GiB/s โ”‚ 16.45 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 926 ยตs โ”‚ 1.843 ms โ”‚ 946.9 ยตs โ”‚ 990.5 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 16.93 GiB/s โ”‚ 8.507 GiB/s โ”‚ 16.56 GiB/s โ”‚ 15.83 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 2.665 ms โ”‚ 3.902 ms โ”‚ 2.914 ms โ”‚ 2.927 ms โ”‚ 100 โ”‚ 100 - โ”‚ 12.45 GiB/s โ”‚ 8.507 GiB/s โ”‚ 11.39 GiB/s โ”‚ 11.34 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 1.934 ms โ”‚ 2.755 ms โ”‚ 2.049 ms โ”‚ 2.076 ms โ”‚ 100 โ”‚ 100 - โ”‚ 16.66 GiB/s โ”‚ 11.69 GiB/s โ”‚ 15.72 GiB/s โ”‚ 15.52 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 1.845 ms โ”‚ 2.32 ms โ”‚ 1.94 ms โ”‚ 1.944 ms โ”‚ 100 โ”‚ 100 - โ”‚ 17.19 GiB/s โ”‚ 13.67 GiB/s โ”‚ 16.35 GiB/s โ”‚ 16.31 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 1.847 ms โ”‚ 2.436 ms โ”‚ 1.914 ms โ”‚ 1.942 ms โ”‚ 100 โ”‚ 100 - โ”‚ 17.05 GiB/s โ”‚ 12.92 GiB/s โ”‚ 16.45 GiB/s โ”‚ 16.21 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.777 ms โ”‚ 2.306 ms โ”‚ 1.834 ms โ”‚ 1.841 ms โ”‚ 100 โ”‚ 100 - 17.65 GiB/s โ”‚ 13.6 GiB/s โ”‚ 17.1 GiB/s โ”‚ 17.04 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ โ”‚ - -# --------------------------------------------------------------------------------------------------------------------------- -# Encoding with `rayon` data-parallelism, also using AVX2 intrinsics for faster vector x scalar multiplication - -Timer precision: 23 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 185.7 ยตs โ”‚ 1.688 ms โ”‚ 226.5 ยตs โ”‚ 277.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 5.584 GiB/s โ”‚ 629.2 MiB/s โ”‚ 4.579 GiB/s โ”‚ 3.736 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 2.68 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 607.5 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 3.73 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.6 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3.07 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”‚ grow: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 2.56 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 54.8 ยตs โ”‚ 169.4 ยตs โ”‚ 93.37 ยตs โ”‚ 96.09 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.37 GiB/s โ”‚ 5.942 GiB/s โ”‚ 10.78 GiB/s โ”‚ 10.48 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 94.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.09 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 54.04 ยตs โ”‚ 220.4 ยตs โ”‚ 96.38 ยตs โ”‚ 102.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.35 GiB/s โ”‚ 4.499 GiB/s โ”‚ 10.29 GiB/s โ”‚ 9.706 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 143.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.14 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 44.13 ยตs โ”‚ 667.3 ยตs โ”‚ 103 ยตs โ”‚ 107.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.3 GiB/s โ”‚ 1.475 GiB/s โ”‚ 9.554 GiB/s โ”‚ 9.175 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 286.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.28 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 45.19 ยตs โ”‚ 792.5 ยตs โ”‚ 109.4 ยตs โ”‚ 132 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 21.7 GiB/s โ”‚ 1.237 GiB/s โ”‚ 8.959 GiB/s โ”‚ 7.429 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 512 B โ”‚ 512 B โ”‚ 512 B โ”‚ 527.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.515 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 8.251 KiB โ”‚ 8.251 KiB โ”‚ 8.251 KiB โ”‚ 8.251 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 4.305 ms โ”‚ 8.177 ms โ”‚ 4.703 ms โ”‚ 4.741 ms โ”‚ 100 โ”‚ 100 - โ”‚ 3.855 GiB/s โ”‚ 2.03 GiB/s โ”‚ 3.529 GiB/s โ”‚ 3.501 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 62.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 2.63 ms โ”‚ 3.415 ms โ”‚ 2.963 ms โ”‚ 2.982 ms โ”‚ 100 โ”‚ 100 - โ”‚ 6.126 GiB/s โ”‚ 4.718 GiB/s โ”‚ 5.437 GiB/s โ”‚ 5.403 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 94.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 1.153 ms โ”‚ 1.697 ms โ”‚ 1.273 ms โ”‚ 1.273 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.76 GiB/s โ”‚ 9.347 GiB/s โ”‚ 12.46 GiB/s โ”‚ 12.45 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 143.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 743.5 ยตs โ”‚ 1.294 ms โ”‚ 862 ยตs โ”‚ 880.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 21.17 GiB/s โ”‚ 12.16 GiB/s โ”‚ 18.26 GiB/s โ”‚ 17.88 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 286.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 586.7 ยตs โ”‚ 1.195 ms โ”‚ 670.4 ยตs โ”‚ 684.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 26.73 GiB/s โ”‚ 13.12 GiB/s โ”‚ 23.39 GiB/s โ”‚ 22.91 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 512 B โ”‚ 512 B โ”‚ 512 B โ”‚ 527.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.51 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 12.81 ms โ”‚ 14.98 ms โ”‚ 13.78 ms โ”‚ 13.75 ms โ”‚ 100 โ”‚ 100 - โ”‚ 2.591 GiB/s โ”‚ 2.216 GiB/s โ”‚ 2.409 GiB/s โ”‚ 2.414 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 62.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 8.681 ms โ”‚ 11.02 ms โ”‚ 9.191 ms โ”‚ 9.226 ms โ”‚ 100 โ”‚ 100 - โ”‚ 3.712 GiB/s โ”‚ 2.924 GiB/s โ”‚ 3.506 GiB/s โ”‚ 3.492 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 94.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 4.778 ms โ”‚ 6.972 ms โ”‚ 5.617 ms โ”‚ 5.632 ms โ”‚ 100 โ”‚ 100 - โ”‚ 6.642 GiB/s โ”‚ 4.552 GiB/s โ”‚ 5.65 GiB/s โ”‚ 5.635 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 143.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 2.21 ms โ”‚ 3.055 ms โ”‚ 2.433 ms โ”‚ 2.444 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.24 GiB/s โ”‚ 10.3 GiB/s โ”‚ 12.94 GiB/s โ”‚ 12.88 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 286.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.386 ms โ”‚ 2.209 ms โ”‚ 1.629 ms โ”‚ 1.619 ms โ”‚ 100 โ”‚ 100 - 22.62 GiB/s โ”‚ 14.2 GiB/s โ”‚ 19.25 GiB/s โ”‚ 19.37 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - 512 B โ”‚ 512 B โ”‚ 512 B โ”‚ 527.2 B โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ -``` - -#### Full RLNC Recoder - -```bash -# Recoding with AVX2-powered SIMD vector x scalar multiplication - -Timer precision: 14 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 22.06 ยตs โ”‚ 37.4 ยตs โ”‚ 25.77 ยตs โ”‚ 26.23 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 24.89 GiB/s โ”‚ 14.69 GiB/s โ”‚ 21.32 GiB/s โ”‚ 20.94 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 19.39 ยตs โ”‚ 27.08 ยตs โ”‚ 22.65 ยตs โ”‚ 22.32 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 26.77 GiB/s โ”‚ 19.17 GiB/s โ”‚ 22.92 GiB/s โ”‚ 23.26 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 17.73 ยตs โ”‚ 22.41 ยตs โ”‚ 18.54 ยตs โ”‚ 18.53 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.5 GiB/s โ”‚ 22.55 GiB/s โ”‚ 27.26 GiB/s โ”‚ 27.28 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 23.28 ยตs โ”‚ 38.67 ยตs โ”‚ 24.12 ยตs โ”‚ 24.57 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 21.63 GiB/s โ”‚ 13.02 GiB/s โ”‚ 20.87 GiB/s โ”‚ 20.49 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 44.62 ยตs โ”‚ 60.58 ยตs โ”‚ 46.58 ยตs โ”‚ 47.26 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 11.71 GiB/s โ”‚ 8.631 GiB/s โ”‚ 11.22 GiB/s โ”‚ 11.06 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 544.1 ยตs โ”‚ 852.5 ยตs โ”‚ 609.4 ยตs โ”‚ 609.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 16.15 GiB/s โ”‚ 10.3 GiB/s โ”‚ 14.42 GiB/s โ”‚ 14.41 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 471.7 ยตs โ”‚ 616.5 ยตs โ”‚ 519.6 ยตs โ”‚ 522.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 17.59 GiB/s โ”‚ 13.46 GiB/s โ”‚ 15.97 GiB/s โ”‚ 15.89 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 398.5 ยตs โ”‚ 587.5 ยตs โ”‚ 464.5 ยตs โ”‚ 466.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 20.22 GiB/s โ”‚ 13.71 GiB/s โ”‚ 17.34 GiB/s โ”‚ 17.28 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 427.6 ยตs โ”‚ 567.9 ยตs โ”‚ 465.8 ยตs โ”‚ 467.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.57 GiB/s โ”‚ 13.98 GiB/s โ”‚ 17.04 GiB/s โ”‚ 16.97 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 423.1 ยตs โ”‚ 718.2 ยตs โ”‚ 490.6 ยตs โ”‚ 494.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.67 GiB/s โ”‚ 11 GiB/s โ”‚ 16.1 GiB/s โ”‚ 15.99 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 1.234 ms โ”‚ 1.604 ms โ”‚ 1.371 ms โ”‚ 1.374 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.23 GiB/s โ”‚ 10.95 GiB/s โ”‚ 12.81 GiB/s โ”‚ 12.78 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 1.112 ms โ”‚ 1.525 ms โ”‚ 1.192 ms โ”‚ 1.194 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.91 GiB/s โ”‚ 10.88 GiB/s โ”‚ 13.92 GiB/s โ”‚ 13.89 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 942.5 ยตs โ”‚ 1.109 ms โ”‚ 1.019 ms โ”‚ 1.017 ms โ”‚ 100 โ”‚ 100 - โ”‚ 17.09 GiB/s โ”‚ 14.51 GiB/s โ”‚ 15.81 GiB/s โ”‚ 15.83 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 935.7 ยตs โ”‚ 1.266 ms โ”‚ 990.8 ยตs โ”‚ 994.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 16.96 GiB/s โ”‚ 12.53 GiB/s โ”‚ 16.02 GiB/s โ”‚ 15.95 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 969.1 ยตs โ”‚ 1.437 ms โ”‚ 1.006 ms โ”‚ 1.015 ms โ”‚ 100 โ”‚ 100 - 16.28 GiB/s โ”‚ 10.97 GiB/s โ”‚ 15.67 GiB/s โ”‚ 15.53 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ โ”‚ - -# --------------------------------------------------------------------------------------------------------------------------- -# Recoding with `rayon` data-parallelism, also using AVX2 intrinsics for faster vector x scalar multiplication - -Timer precision: 25 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 79.71 ยตs โ”‚ 314.3 ยตs โ”‚ 165.7 ยตs โ”‚ 169.8 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 6.892 GiB/s โ”‚ 1.747 GiB/s โ”‚ 3.314 GiB/s โ”‚ 3.234 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 48 B โ”‚ 48 B โ”‚ 48 B โ”‚ 63.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 192 KiB โ”‚ 192 KiB โ”‚ 192 KiB โ”‚ 192 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 93.73 ยตs โ”‚ 452.7 ยตs โ”‚ 248.6 ยตs โ”‚ 264.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 5.54 GiB/s โ”‚ 1.147 GiB/s โ”‚ 2.088 GiB/s โ”‚ 1.965 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 96 B โ”‚ 96 B โ”‚ 96 B โ”‚ 126.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.12 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 96.06 KiB โ”‚ 96.06 KiB โ”‚ 96.06 KiB โ”‚ 96.06 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 91.63 ยตs โ”‚ 789.7 ยตs โ”‚ 211.5 ยตs โ”‚ 234.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 5.517 GiB/s โ”‚ 655.5 MiB/s โ”‚ 2.39 GiB/s โ”‚ 2.156 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 192 B โ”‚ 192 B โ”‚ 192 B โ”‚ 207.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 48.12 KiB โ”‚ 48.12 KiB โ”‚ 48.12 KiB โ”‚ 48.12 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 57.64 ยตs โ”‚ 179.8 ยตs โ”‚ 102 ยตs โ”‚ 103.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 8.738 GiB/s โ”‚ 2.8 GiB/s โ”‚ 4.934 GiB/s โ”‚ 4.86 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 384 B โ”‚ 384 B โ”‚ 384 B โ”‚ 414.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.4 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 24.25 KiB โ”‚ 24.25 KiB โ”‚ 24.25 KiB โ”‚ 24.25 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 77.32 ยตs โ”‚ 240.6 ยตs โ”‚ 118.5 ยตs โ”‚ 123.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 6.763 GiB/s โ”‚ 2.172 GiB/s โ”‚ 4.409 GiB/s โ”‚ 4.235 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 768 B โ”‚ 768 B โ”‚ 768 B โ”‚ 783.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.766 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 12.5 KiB โ”‚ 12.5 KiB โ”‚ 12.5 KiB โ”‚ 12.5 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 1.964 ms โ”‚ 3.789 ms โ”‚ 2.371 ms โ”‚ 2.424 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.473 GiB/s โ”‚ 2.319 GiB/s โ”‚ 3.706 GiB/s โ”‚ 3.624 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 48 B โ”‚ 48 B โ”‚ 48 B โ”‚ 63.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 1.716 ms โ”‚ 2.756 ms โ”‚ 1.914 ms โ”‚ 1.958 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.836 GiB/s โ”‚ 3.011 GiB/s โ”‚ 4.337 GiB/s โ”‚ 4.238 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 96 B โ”‚ 96 B โ”‚ 96 B โ”‚ 126.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 890.7 ยตs โ”‚ 1.648 ms โ”‚ 1.062 ms โ”‚ 1.089 ms โ”‚ 100 โ”‚ 100 - โ”‚ 9.046 GiB/s โ”‚ 4.887 GiB/s โ”‚ 7.581 GiB/s โ”‚ 7.399 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 1.671 KiB โ”‚ 192 B โ”‚ 192 B โ”‚ 222.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 513.6 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 768.1 KiB โ”‚ 768.1 KiB โ”‚ 768.1 KiB โ”‚ 768.1 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 609.9 ยตs โ”‚ 1.144 ms โ”‚ 763.9 ยตs โ”‚ 787.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 13.02 GiB/s โ”‚ 6.939 GiB/s โ”‚ 10.39 GiB/s โ”‚ 10.08 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 384 B โ”‚ 384 B โ”‚ 384 B โ”‚ 414.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.4 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 384.2 KiB โ”‚ 384.2 KiB โ”‚ 384.2 KiB โ”‚ 384.2 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 593.1 ยตs โ”‚ 1.428 ms โ”‚ 716.2 ยตs โ”‚ 770 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 13.32 GiB/s โ”‚ 5.532 GiB/s โ”‚ 11.03 GiB/s โ”‚ 10.26 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 768 B โ”‚ 768 B โ”‚ 768 B โ”‚ 783.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 192.5 KiB โ”‚ 192.5 KiB โ”‚ 192.5 KiB โ”‚ 192.5 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 5.115 ms โ”‚ 6.58 ms โ”‚ 5.597 ms โ”‚ 5.633 ms โ”‚ 100 โ”‚ 100 - โ”‚ 3.436 GiB/s โ”‚ 2.671 GiB/s โ”‚ 3.14 GiB/s โ”‚ 3.12 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 48 B โ”‚ 48 B โ”‚ 48 B โ”‚ 78.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 6 MiB โ”‚ 6 MiB โ”‚ 6 MiB โ”‚ 6 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 4.446 ms โ”‚ 5.619 ms โ”‚ 4.831 ms โ”‚ 4.889 ms โ”‚ 100 โ”‚ 100 - โ”‚ 3.733 GiB/s โ”‚ 2.954 GiB/s โ”‚ 3.436 GiB/s โ”‚ 3.395 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 96 B โ”‚ 96 B โ”‚ 96 B โ”‚ 126.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 2.965 ms โ”‚ 4.632 ms โ”‚ 3.2 ms โ”‚ 3.27 ms โ”‚ 100 โ”‚ 100 - โ”‚ 5.433 GiB/s โ”‚ 3.478 GiB/s โ”‚ 5.035 GiB/s โ”‚ 4.927 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 192 B โ”‚ 192 B โ”‚ 192 B โ”‚ 222.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 1.337 ms โ”‚ 2.332 ms โ”‚ 1.614 ms โ”‚ 1.661 ms โ”‚ 100 โ”‚ 100 - โ”‚ 11.86 GiB/s โ”‚ 6.807 GiB/s โ”‚ 9.834 GiB/s โ”‚ 9.557 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 384 B โ”‚ 384 B โ”‚ 384 B โ”‚ 414.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.4 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 768.2 KiB โ”‚ 768.2 KiB โ”‚ 768.2 KiB โ”‚ 768.2 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 990.8 ยตs โ”‚ 2.347 ms โ”‚ 1.249 ms โ”‚ 1.286 ms โ”‚ 100 โ”‚ 100 - 15.92 GiB/s โ”‚ 6.722 GiB/s โ”‚ 12.63 GiB/s โ”‚ 12.26 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - 768 B โ”‚ 768 B โ”‚ 768 B โ”‚ 783.2 B โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - 384.5 KiB โ”‚ 384.5 KiB โ”‚ 384.5 KiB โ”‚ 384.5 KiB โ”‚ โ”‚ -``` - -#### Full RLNC Decoder - -```bash -# Decoding with AVX2-powered SIMD vector x scalar multiplication - -Timer precision: 18 ns -full_rlnc_decoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ decode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 600 ยตs โ”‚ 1.041 ms โ”‚ 615.2 ยตs โ”‚ 622.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 1.627 GiB/s โ”‚ 960.8 MiB/s โ”‚ 1.587 GiB/s โ”‚ 1.568 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 1.18 ms โ”‚ 1.629 ms โ”‚ 1.201 ms โ”‚ 1.207 ms โ”‚ 100 โ”‚ 100 - โ”‚ 847.6 MiB/s โ”‚ 614.1 MiB/s โ”‚ 833 MiB/s โ”‚ 829.2 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 2.267 ms โ”‚ 2.404 ms โ”‚ 2.299 ms โ”‚ 2.302 ms โ”‚ 100 โ”‚ 100 - โ”‚ 442.7 MiB/s โ”‚ 417.5 MiB/s โ”‚ 436.6 MiB/s โ”‚ 436 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 5.296 ms โ”‚ 5.583 ms โ”‚ 5.333 ms โ”‚ 5.338 ms โ”‚ 100 โ”‚ 100 - โ”‚ 191.7 MiB/s โ”‚ 181.9 MiB/s โ”‚ 190.4 MiB/s โ”‚ 190.2 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 15.27 ms โ”‚ 16.21 ms โ”‚ 15.55 ms โ”‚ 15.55 ms โ”‚ 100 โ”‚ 100 - โ”‚ 69.59 MiB/s โ”‚ 65.54 MiB/s โ”‚ 68.33 MiB/s โ”‚ 68.32 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 16.4 ms โ”‚ 20.56 ms โ”‚ 16.97 ms โ”‚ 17.08 ms โ”‚ 100 โ”‚ 100 - โ”‚ 975.5 MiB/s โ”‚ 778.1 MiB/s โ”‚ 942.4 MiB/s โ”‚ 936.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 27.24 ms โ”‚ 30.95 ms โ”‚ 28.12 ms โ”‚ 28.26 ms โ”‚ 100 โ”‚ 100 - โ”‚ 587.3 MiB/s โ”‚ 516.8 MiB/s โ”‚ 568.9 MiB/s โ”‚ 566 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 49.54 ms โ”‚ 62.7 ms โ”‚ 49.74 ms โ”‚ 50.23 ms โ”‚ 100 โ”‚ 100 - โ”‚ 323 MiB/s โ”‚ 255.2 MiB/s โ”‚ 321.6 MiB/s โ”‚ 318.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 98.43 ms โ”‚ 102.1 ms โ”‚ 98.98 ms โ”‚ 99.32 ms โ”‚ 100 โ”‚ 100 - โ”‚ 162.6 MiB/s โ”‚ 156.7 MiB/s โ”‚ 161.8 MiB/s โ”‚ 161.2 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 201.8 ms โ”‚ 209.3 ms โ”‚ 202.7 ms โ”‚ 203 ms โ”‚ 100 โ”‚ 100 - โ”‚ 79.58 MiB/s โ”‚ 76.73 MiB/s โ”‚ 79.21 MiB/s โ”‚ 79.11 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 46.33 ms โ”‚ 49.04 ms โ”‚ 46.51 ms โ”‚ 46.7 ms โ”‚ 100 โ”‚ 100 - โ”‚ 690.5 MiB/s โ”‚ 652.4 MiB/s โ”‚ 687.8 MiB/s โ”‚ 685.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 78.74 ms โ”‚ 81.78 ms โ”‚ 79.06 ms โ”‚ 79.29 ms โ”‚ 100 โ”‚ 100 - โ”‚ 406.4 MiB/s โ”‚ 391.2 MiB/s โ”‚ 404.7 MiB/s โ”‚ 403.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 132.4 ms โ”‚ 137.6 ms โ”‚ 132.9 ms โ”‚ 133.3 ms โ”‚ 100 โ”‚ 100 - โ”‚ 241.5 MiB/s โ”‚ 232.4 MiB/s โ”‚ 240.7 MiB/s โ”‚ 239.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 241.9 ms โ”‚ 249.3 ms โ”‚ 243.1 ms โ”‚ 243.6 ms โ”‚ 100 โ”‚ 100 - โ”‚ 132.3 MiB/s โ”‚ 128.4 MiB/s โ”‚ 131.6 MiB/s โ”‚ 131.4 MiB/s โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 476 ms โ”‚ 485.5 ms โ”‚ 479.1 ms โ”‚ 479.4 ms โ”‚ 100 โ”‚ 100 - 67.35 MiB/s โ”‚ 66.03 MiB/s โ”‚ 66.9 MiB/s โ”‚ 66.87 MiB/s โ”‚ โ”‚ -``` - -
- -### On AWS EC2 `m8g.large` with Graviton4 CPU - -Running benchmarks on `Linux 6.8.0-1029-aws aarch64`, compiled with `rustc 1.89.0 (29483883e 2025-08-04)`. - -Component | Peak Median Throughput (`default` feature) | Peak Median Throughput (`parallel` feature) | Impact of number of pieces on performance ---- | --- | --- | --- -Full RLNC Encoder | **19.73 GiB/s** | **12.95 GiB/s** | The number of pieces original data got split into has a **minimal** impact on the encoding speed. -Full RLNC Recoder | **19.2 GiB/s** | **10.43 GiB/s** | Similar to the encoder, the recoder's performance remains largely consistent regardless of how many pieces the original data is split into. -Full RLNC Decoder | **0.84 GiB/s** | **Doesn't yet implement a parallel decoding mode** | As the number of pieces increases, the decoding time increases substantially, leading to a considerable drop in throughput. This indicates that decoding is the most computationally intensive part of the full RLNC scheme, and its performance is inversely proportional to the number of pieces. - -In summary, the full RLNC implementation demonstrates excellent encoding and recoding speeds, consistently achieving GiB/s throughputs with minimal sensitivity to the number of data pieces. The `parallel` feature, leveraging Rust `rayon` data-parallelism framework, also provides good performance for both encoding and recoding. Whether you want to use that feature, completely depends on your usecase. However, decoding remains a much slower operation, with its performance significantly diminishing as the data is split into a greater number of pieces, and currently does **not** implement a parallel decoding algorithm. - -
-Click to view detailed benchmark results ๐Ÿ‘‡ - -#### Full RLNC Encoder - -```bash -# Encoding with NEON-powered SIMD vector x scalar multiplication - -Timer precision: 30 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 48.42 ยตs โ”‚ 95.57 ยตs โ”‚ 54.2 ยตs โ”‚ 58.82 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 21.42 GiB/s โ”‚ 10.85 GiB/s โ”‚ 19.14 GiB/s โ”‚ 17.63 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 48.87 ยตs โ”‚ 79.4 ยตs โ”‚ 51.04 ยตs โ”‚ 56.78 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 20.6 GiB/s โ”‚ 12.68 GiB/s โ”‚ 19.73 GiB/s โ”‚ 17.73 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 49.69 ยตs โ”‚ 79.63 ยตs โ”‚ 51.64 ยตs โ”‚ 57.23 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 19.96 GiB/s โ”‚ 12.45 GiB/s โ”‚ 19.2 GiB/s โ”‚ 17.33 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 50.13 ยตs โ”‚ 83.67 ยตs โ”‚ 51.43 ยตs โ”‚ 57.33 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 19.63 GiB/s โ”‚ 11.76 GiB/s โ”‚ 19.13 GiB/s โ”‚ 17.16 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 50.62 ยตs โ”‚ 80.58 ยตs โ”‚ 52.07 ยตs โ”‚ 57.94 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 19.37 GiB/s โ”‚ 12.17 GiB/s โ”‚ 18.83 GiB/s โ”‚ 16.92 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 1.187 ms โ”‚ 1.419 ms โ”‚ 1.277 ms โ”‚ 1.287 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.97 GiB/s โ”‚ 11.69 GiB/s โ”‚ 13 GiB/s โ”‚ 12.89 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 1.111 ms โ”‚ 1.316 ms โ”‚ 1.231 ms โ”‚ 1.233 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.49 GiB/s โ”‚ 12.23 GiB/s โ”‚ 13.08 GiB/s โ”‚ 13.06 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 1.171 ms โ”‚ 1.281 ms โ”‚ 1.219 ms โ”‚ 1.219 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.55 GiB/s โ”‚ 12.38 GiB/s โ”‚ 13.01 GiB/s โ”‚ 13.01 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 1.16 ms โ”‚ 1.254 ms โ”‚ 1.21 ms โ”‚ 1.21 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.57 GiB/s โ”‚ 12.55 GiB/s โ”‚ 13 GiB/s โ”‚ 13 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 1.125 ms โ”‚ 1.302 ms โ”‚ 1.175 ms โ”‚ 1.179 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.93 GiB/s โ”‚ 12.04 GiB/s โ”‚ 13.34 GiB/s โ”‚ 13.29 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 2.405 ms โ”‚ 3.332 ms โ”‚ 2.653 ms โ”‚ 2.663 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.8 GiB/s โ”‚ 9.962 GiB/s โ”‚ 12.51 GiB/s โ”‚ 12.46 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ 16 B โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 2.388 ms โ”‚ 2.928 ms โ”‚ 2.569 ms โ”‚ 2.602 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.49 GiB/s โ”‚ 11 GiB/s โ”‚ 12.54 GiB/s โ”‚ 12.38 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 2.416 ms โ”‚ 2.704 ms โ”‚ 2.487 ms โ”‚ 2.492 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.13 GiB/s โ”‚ 11.73 GiB/s โ”‚ 12.75 GiB/s โ”‚ 12.73 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 2.442 ms โ”‚ 2.596 ms โ”‚ 2.501 ms โ”‚ 2.501 ms โ”‚ 100 โ”‚ 100 - โ”‚ 12.89 GiB/s โ”‚ 12.12 GiB/s โ”‚ 12.59 GiB/s โ”‚ 12.58 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 2.453 ms โ”‚ 2.734 ms โ”‚ 2.499 ms โ”‚ 2.508 ms โ”‚ 100 โ”‚ 100 - 12.78 GiB/s โ”‚ 11.47 GiB/s โ”‚ 12.54 GiB/s โ”‚ 12.5 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ - 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ โ”‚ - -# --------------------------------------------------------------------------------------------------------------------------- -# Encoding with `rayon` data-parallelism, also using NEON intrinsics for faster vector x scalar multiplication - -Timer precision: 29 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 293.3 ยตs โ”‚ 586.2 ยตs โ”‚ 312.7 ยตs โ”‚ 315.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 3.537 GiB/s โ”‚ 1.77 GiB/s โ”‚ 3.317 GiB/s โ”‚ 3.29 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 28 โ”‚ 1 โ”‚ 1.28 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 8.89 KiB โ”‚ 32 B โ”‚ 137.9 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 34 โ”‚ 2 โ”‚ 2.33 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 73.28 KiB โ”‚ 64.03 KiB โ”‚ 64.13 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 10 โ”‚ 3 โ”‚ 3.07 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128.5 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 86.27 ยตs โ”‚ 139.5 ยตs โ”‚ 117 ยตs โ”‚ 113.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 11.67 GiB/s โ”‚ 7.218 GiB/s โ”‚ 8.606 GiB/s โ”‚ 8.903 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 94.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.09 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 63.67 ยตs โ”‚ 99.71 ยตs โ”‚ 94.41 ยตs โ”‚ 87.67 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 15.57 GiB/s โ”‚ 9.947 GiB/s โ”‚ 10.5 GiB/s โ”‚ 11.31 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 143.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.14 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 61.64 ยตs โ”‚ 91.68 ยตs โ”‚ 78.71 ยตs โ”‚ 75.94 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 15.97 GiB/s โ”‚ 10.73 GiB/s โ”‚ 12.5 GiB/s โ”‚ 12.96 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 286.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.28 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 60.71 ยตs โ”‚ 89.44 ยตs โ”‚ 75.68 ยตs โ”‚ 75.35 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 16.15 GiB/s โ”‚ 10.96 GiB/s โ”‚ 12.95 GiB/s โ”‚ 13.01 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 512 B โ”‚ 512 B โ”‚ 512 B โ”‚ 527.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.515 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 8.251 KiB โ”‚ 8.251 KiB โ”‚ 8.251 KiB โ”‚ 8.251 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 4.133 ms โ”‚ 6.11 ms โ”‚ 4.273 ms โ”‚ 4.311 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.016 GiB/s โ”‚ 2.716 GiB/s โ”‚ 3.885 GiB/s โ”‚ 3.85 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 62.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 1.894 ms โ”‚ 2.374 ms โ”‚ 1.928 ms โ”‚ 1.936 ms โ”‚ 100 โ”‚ 100 - โ”‚ 8.507 GiB/s โ”‚ 6.785 GiB/s โ”‚ 8.355 GiB/s โ”‚ 8.322 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1.5 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 824 B โ”‚ 94.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2.5 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512.8 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 1.526 ms โ”‚ 2.026 ms โ”‚ 1.58 ms โ”‚ 1.585 ms โ”‚ 100 โ”‚ 100 - โ”‚ 10.39 GiB/s โ”‚ 7.83 GiB/s โ”‚ 10.04 GiB/s โ”‚ 10 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 143.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 1.401 ms โ”‚ 2.082 ms โ”‚ 1.441 ms โ”‚ 1.449 ms โ”‚ 100 โ”‚ 100 - โ”‚ 11.23 GiB/s โ”‚ 7.562 GiB/s โ”‚ 10.92 GiB/s โ”‚ 10.86 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 286.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 1.314 ms โ”‚ 2.428 ms โ”‚ 1.363 ms โ”‚ 1.393 ms โ”‚ 100 โ”‚ 100 - โ”‚ 11.93 GiB/s โ”‚ 6.459 GiB/s โ”‚ 11.5 GiB/s โ”‚ 11.25 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 512 B โ”‚ 512 B โ”‚ 512 B โ”‚ 527.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.51 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 13.55 ms โ”‚ 15.75 ms โ”‚ 14.09 ms โ”‚ 14.11 ms โ”‚ 100 โ”‚ 100 - โ”‚ 2.448 GiB/s โ”‚ 2.108 GiB/s โ”‚ 2.356 GiB/s โ”‚ 2.352 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 32 B โ”‚ 32 B โ”‚ 32 B โ”‚ 62.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 5.465 ms โ”‚ 5.93 ms โ”‚ 5.64 ms โ”‚ 5.647 ms โ”‚ 100 โ”‚ 100 - โ”‚ 5.896 GiB/s โ”‚ 5.434 GiB/s โ”‚ 5.713 GiB/s โ”‚ 5.706 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 64 B โ”‚ 64 B โ”‚ 64 B โ”‚ 94.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 3.184 ms โ”‚ 3.789 ms โ”‚ 3.23 ms โ”‚ 3.237 ms โ”‚ 100 โ”‚ 100 - โ”‚ 9.966 GiB/s โ”‚ 8.374 GiB/s โ”‚ 9.825 GiB/s โ”‚ 9.803 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - โ”‚ 128 B โ”‚ 128 B โ”‚ 128 B โ”‚ 143.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 2.812 ms โ”‚ 2.909 ms โ”‚ 2.869 ms โ”‚ 2.867 ms โ”‚ 100 โ”‚ 100 - โ”‚ 11.19 GiB/s โ”‚ 10.82 GiB/s โ”‚ 10.97 GiB/s โ”‚ 10.98 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ - โ”‚ 256 B โ”‚ 256 B โ”‚ 256 B โ”‚ 286.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 2.765 ms โ”‚ 2.871 ms โ”‚ 2.823 ms โ”‚ 2.825 ms โ”‚ 100 โ”‚ 100 - 11.34 GiB/s โ”‚ 10.92 GiB/s โ”‚ 11.11 GiB/s โ”‚ 11.1 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ - 512 B โ”‚ 512 B โ”‚ 512 B โ”‚ 527.2 B โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ -``` - -#### Full RLNC Recoder - -```bash -# Recoding with NEON-powered SIMD vector x scalar multiplication - -Timer precision: 30 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 27.49 ยตs โ”‚ 41.84 ยตs โ”‚ 28.61 ยตs โ”‚ 29.38 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 19.98 GiB/s โ”‚ 13.13 GiB/s โ”‚ 19.2 GiB/s โ”‚ 18.69 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 24.3 ยตs โ”‚ 43.78 ยตs โ”‚ 36.83 ยตs โ”‚ 33.03 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 21.36 GiB/s โ”‚ 11.86 GiB/s โ”‚ 14.09 GiB/s โ”‚ 15.72 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 25.18 ยตs โ”‚ 44.22 ยตs โ”‚ 38.97 ยตs โ”‚ 34.28 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 20.07 GiB/s โ”‚ 11.43 GiB/s โ”‚ 12.97 GiB/s โ”‚ 14.74 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ 16.12 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 32.77 ยตs โ”‚ 50.62 ยตs โ”‚ 41.25 ยตs โ”‚ 40.07 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 15.36 GiB/s โ”‚ 9.95 GiB/s โ”‚ 12.21 GiB/s โ”‚ 12.56 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ 8.25 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 57.61 ยตs โ”‚ 74.53 ยตs โ”‚ 59.79 ยตs โ”‚ 62.69 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 9.076 GiB/s โ”‚ 7.016 GiB/s โ”‚ 8.745 GiB/s โ”‚ 8.341 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ 4.5 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 546.8 ยตs โ”‚ 692.2 ยตs โ”‚ 648.8 ยตs โ”‚ 649.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 16.07 GiB/s โ”‚ 12.69 GiB/s โ”‚ 13.54 GiB/s โ”‚ 13.53 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 554.7 ยตs โ”‚ 660.2 ยตs โ”‚ 610.1 ยตs โ”‚ 605.5 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 14.96 GiB/s โ”‚ 12.57 GiB/s โ”‚ 13.6 GiB/s โ”‚ 13.7 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 534.3 ยตs โ”‚ 631.3 ยตs โ”‚ 599.2 ยตs โ”‚ 596.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 15.08 GiB/s โ”‚ 12.76 GiB/s โ”‚ 13.44 GiB/s โ”‚ 13.5 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 563.4 ยตs โ”‚ 651.1 ยตs โ”‚ 606.2 ยตs โ”‚ 604.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 14.09 GiB/s โ”‚ 12.19 GiB/s โ”‚ 13.1 GiB/s โ”‚ 13.13 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 564.6 ยตs โ”‚ 636.5 ยตs โ”‚ 610.1 ยตs โ”‚ 606.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 13.99 GiB/s โ”‚ 12.41 GiB/s โ”‚ 12.95 GiB/s โ”‚ 13.04 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ 64.5 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 1.215 ms โ”‚ 1.469 ms โ”‚ 1.394 ms โ”‚ 1.39 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.46 GiB/s โ”‚ 11.96 GiB/s โ”‚ 12.6 GiB/s โ”‚ 12.64 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 1.163 ms โ”‚ 1.411 ms โ”‚ 1.258 ms โ”‚ 1.259 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.27 GiB/s โ”‚ 11.75 GiB/s โ”‚ 13.19 GiB/s โ”‚ 13.18 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 1.068 ms โ”‚ 1.256 ms โ”‚ 1.198 ms โ”‚ 1.194 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.08 GiB/s โ”‚ 12.82 GiB/s โ”‚ 13.44 GiB/s โ”‚ 13.48 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ 512.1 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 1.161 ms โ”‚ 1.43 ms โ”‚ 1.214 ms โ”‚ 1.22 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.66 GiB/s โ”‚ 11.09 GiB/s โ”‚ 13.07 GiB/s โ”‚ 13 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ 256.2 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 1.191 ms โ”‚ 1.275 ms โ”‚ 1.214 ms โ”‚ 1.216 ms โ”‚ 100 โ”‚ 100 - 13.23 GiB/s โ”‚ 12.37 GiB/s โ”‚ 12.98 GiB/s โ”‚ 12.96 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 4 โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ โ”‚ - 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 3 โ”‚ 3 โ”‚ 3 โ”‚ 3 โ”‚ โ”‚ - 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ 128.5 KiB โ”‚ โ”‚ - -# --------------------------------------------------------------------------------------------------------------------------- -# Recoding with `rayon` data-parallelism, also using NEON intrinsics for faster vector x scalar multiplication - -Timer precision: 30 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 62.72 ยตs โ”‚ 113.7 ยตs โ”‚ 76.8 ยตs โ”‚ 78.65 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 8.759 GiB/s โ”‚ 4.828 GiB/s โ”‚ 7.154 GiB/s โ”‚ 6.985 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 48 B โ”‚ 48 B โ”‚ 48 B โ”‚ 63.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 192 KiB โ”‚ 192 KiB โ”‚ 192 KiB โ”‚ 192 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 60.66 ยตs โ”‚ 106.2 ยตs โ”‚ 91.03 ยตs โ”‚ 88.24 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 8.56 GiB/s โ”‚ 4.889 GiB/s โ”‚ 5.704 GiB/s โ”‚ 5.885 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 96 B โ”‚ 96 B โ”‚ 96 B โ”‚ 126.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.09 KiB โ”‚ 64.12 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 96.06 KiB โ”‚ 96.06 KiB โ”‚ 96.06 KiB โ”‚ 96.06 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 50.34 ยตs โ”‚ 87.71 ยตs โ”‚ 69.52 ยตs โ”‚ 70.19 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 10.04 GiB/s โ”‚ 5.763 GiB/s โ”‚ 7.271 GiB/s โ”‚ 7.202 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 192 B โ”‚ 192 B โ”‚ 192 B โ”‚ 207.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.18 KiB โ”‚ 32.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 48.12 KiB โ”‚ 48.12 KiB โ”‚ 48.12 KiB โ”‚ 48.12 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 51.52 ยตs โ”‚ 80.65 ยตs โ”‚ 66 ยตs โ”‚ 66.44 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 9.775 GiB/s โ”‚ 6.245 GiB/s โ”‚ 7.631 GiB/s โ”‚ 7.58 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 384 B โ”‚ 384 B โ”‚ 384 B โ”‚ 414.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.37 KiB โ”‚ 16.4 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 24.25 KiB โ”‚ 24.25 KiB โ”‚ 24.25 KiB โ”‚ 24.25 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 74.76 ยตs โ”‚ 104.8 ยตs โ”‚ 87.53 ยตs โ”‚ 87.52 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 6.995 GiB/s โ”‚ 4.99 GiB/s โ”‚ 5.974 GiB/s โ”‚ 5.975 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 768 B โ”‚ 768 B โ”‚ 768 B โ”‚ 783.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.751 KiB โ”‚ 8.766 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 12.5 KiB โ”‚ 12.5 KiB โ”‚ 12.5 KiB โ”‚ 12.5 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 1.535 ms โ”‚ 2.769 ms โ”‚ 1.61 ms โ”‚ 1.65 ms โ”‚ 100 โ”‚ 100 - โ”‚ 5.722 GiB/s โ”‚ 3.173 GiB/s โ”‚ 5.456 GiB/s โ”‚ 5.324 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 48 B โ”‚ 48 B โ”‚ 48 B โ”‚ 63.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 1.291 ms โ”‚ 2.089 ms โ”‚ 1.35 ms โ”‚ 1.384 ms โ”‚ 100 โ”‚ 100 - โ”‚ 6.427 GiB/s โ”‚ 3.973 GiB/s โ”‚ 6.147 GiB/s โ”‚ 5.996 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2.5 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 96 B โ”‚ 96 B โ”‚ 856 B โ”‚ 126.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4.5 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 896.5 ยตs โ”‚ 1.281 ms โ”‚ 938 ยตs โ”‚ 945.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 8.988 GiB/s โ”‚ 6.287 GiB/s โ”‚ 8.59 GiB/s โ”‚ 8.52 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 3 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 192 B โ”‚ 1.671 KiB โ”‚ 192 B โ”‚ 222.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 5 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 512.1 KiB โ”‚ 513.6 KiB โ”‚ 512.1 KiB โ”‚ 512.2 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 768.1 KiB โ”‚ 768.1 KiB โ”‚ 768.1 KiB โ”‚ 768.1 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 786.4 ยตs โ”‚ 1.679 ms โ”‚ 825.5 ยตs โ”‚ 873.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 10.09 GiB/s โ”‚ 4.729 GiB/s โ”‚ 9.621 GiB/s โ”‚ 9.096 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 384 B โ”‚ 384 B โ”‚ 384 B โ”‚ 414.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.3 KiB โ”‚ 256.4 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 384.2 KiB โ”‚ 384.2 KiB โ”‚ 384.2 KiB โ”‚ 384.2 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 755.4 ยตs โ”‚ 1.283 ms โ”‚ 786 ยตs โ”‚ 831.8 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 10.46 GiB/s โ”‚ 6.157 GiB/s โ”‚ 10.05 GiB/s โ”‚ 9.502 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - โ”‚ 768 B โ”‚ 768 B โ”‚ 768 B โ”‚ 783.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ 128.7 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 192.5 KiB โ”‚ 192.5 KiB โ”‚ 192.5 KiB โ”‚ 192.5 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 3.313 ms โ”‚ 5.537 ms โ”‚ 3.483 ms โ”‚ 3.566 ms โ”‚ 100 โ”‚ 100 - โ”‚ 5.305 GiB/s โ”‚ 3.174 GiB/s โ”‚ 5.046 GiB/s โ”‚ 4.928 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 48 B โ”‚ 48 B โ”‚ 48 B โ”‚ 78.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 6 MiB โ”‚ 6 MiB โ”‚ 6 MiB โ”‚ 6 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 2.879 ms โ”‚ 5.134 ms โ”‚ 3.067 ms โ”‚ 3.12 ms โ”‚ 100 โ”‚ 100 - โ”‚ 5.765 GiB/s โ”‚ 3.233 GiB/s โ”‚ 5.413 GiB/s โ”‚ 5.32 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 96 B โ”‚ 96 B โ”‚ 96 B โ”‚ 126.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ 3 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 1.922 ms โ”‚ 3.468 ms โ”‚ 1.996 ms โ”‚ 2.021 ms โ”‚ 100 โ”‚ 100 - โ”‚ 8.381 GiB/s โ”‚ 4.646 GiB/s โ”‚ 8.073 GiB/s โ”‚ 7.973 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2.5 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 192 B โ”‚ 192 B โ”‚ 952 B โ”‚ 222.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4.5 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ 1.5 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 1.556 ms โ”‚ 2.314 ms โ”‚ 1.599 ms โ”‚ 1.628 ms โ”‚ 100 โ”‚ 100 - โ”‚ 10.19 GiB/s โ”‚ 6.86 GiB/s โ”‚ 9.927 GiB/s โ”‚ 9.747 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.02 โ”‚ โ”‚ - โ”‚ 384 B โ”‚ 384 B โ”‚ 384 B โ”‚ 414.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.02 โ”‚ โ”‚ - โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.3 KiB โ”‚ 512.4 KiB โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - โ”‚ 768.2 KiB โ”‚ 768.2 KiB โ”‚ 768.2 KiB โ”‚ 768.2 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 1.481 ms โ”‚ 1.76 ms โ”‚ 1.512 ms โ”‚ 1.529 ms โ”‚ 100 โ”‚ 100 - 10.64 GiB/s โ”‚ 8.963 GiB/s โ”‚ 10.43 GiB/s โ”‚ 10.31 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2.01 โ”‚ โ”‚ - 768 B โ”‚ 768 B โ”‚ 768 B โ”‚ 783.2 B โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 4 โ”‚ 4 โ”‚ 4 โ”‚ 4.01 โ”‚ โ”‚ - 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ 256.7 KiB โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 5 โ”‚ 5 โ”‚ 5 โ”‚ 5 โ”‚ โ”‚ - 384.5 KiB โ”‚ 384.5 KiB โ”‚ 384.5 KiB โ”‚ 384.5 KiB โ”‚ โ”‚ -``` - -#### Full RLNC Decoder - -```bash -# Decoding with NEON-powered SIMD vector x scalar multiplication - -Timer precision: 30 ns -full_rlnc_decoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ decode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 1.124 ms โ”‚ 1.409 ms โ”‚ 1.163 ms โ”‚ 1.165 ms โ”‚ 100 โ”‚ 100 - โ”‚ 889.4 MiB/s โ”‚ 709.6 MiB/s โ”‚ 859.6 MiB/s โ”‚ 858.2 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 1.921 ms โ”‚ 2.209 ms โ”‚ 1.972 ms โ”‚ 1.972 ms โ”‚ 100 โ”‚ 100 - โ”‚ 520.9 MiB/s โ”‚ 453 MiB/s โ”‚ 507.4 MiB/s โ”‚ 507.3 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 3.873 ms โ”‚ 3.94 ms โ”‚ 3.896 ms โ”‚ 3.896 ms โ”‚ 100 โ”‚ 100 - โ”‚ 259.1 MiB/s โ”‚ 254.7 MiB/s โ”‚ 257.6 MiB/s โ”‚ 257.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 8.395 ms โ”‚ 8.71 ms โ”‚ 8.428 ms โ”‚ 8.431 ms โ”‚ 100 โ”‚ 100 - โ”‚ 120.9 MiB/s โ”‚ 116.6 MiB/s โ”‚ 120.5 MiB/s โ”‚ 120.4 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 21.13 ms โ”‚ 21.46 ms โ”‚ 21.18 ms โ”‚ 21.18 ms โ”‚ 100 โ”‚ 100 - โ”‚ 50.28 MiB/s โ”‚ 49.52 MiB/s โ”‚ 50.16 MiB/s โ”‚ 50.16 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 21.14 ms โ”‚ 24.37 ms โ”‚ 21.34 ms โ”‚ 21.38 ms โ”‚ 100 โ”‚ 100 - โ”‚ 756.7 MiB/s โ”‚ 656.3 MiB/s โ”‚ 749.7 MiB/s โ”‚ 748.3 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 41.03 ms โ”‚ 42.49 ms โ”‚ 41.52 ms โ”‚ 41.56 ms โ”‚ 100 โ”‚ 100 - โ”‚ 389.9 MiB/s โ”‚ 376.5 MiB/s โ”‚ 385.3 MiB/s โ”‚ 384.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 81.35 ms โ”‚ 85.9 ms โ”‚ 82.83 ms โ”‚ 83.08 ms โ”‚ 100 โ”‚ 100 - โ”‚ 196.7 MiB/s โ”‚ 186.2 MiB/s โ”‚ 193.1 MiB/s โ”‚ 192.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 161.9 ms โ”‚ 181.5 ms โ”‚ 165.3 ms โ”‚ 165.9 ms โ”‚ 100 โ”‚ 100 - โ”‚ 98.92 MiB/s โ”‚ 88.19 MiB/s โ”‚ 96.88 MiB/s โ”‚ 96.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 318.8 ms โ”‚ 337.4 ms โ”‚ 326.3 ms โ”‚ 326.7 ms โ”‚ 100 โ”‚ 100 - โ”‚ 50.38 MiB/s โ”‚ 47.6 MiB/s โ”‚ 49.22 MiB/s โ”‚ 49.15 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 49.19 ms โ”‚ 52.28 ms โ”‚ 49.53 ms โ”‚ 49.78 ms โ”‚ 100 โ”‚ 100 - โ”‚ 650.4 MiB/s โ”‚ 611.9 MiB/s โ”‚ 646 MiB/s โ”‚ 642.8 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 88.63 ms โ”‚ 94.25 ms โ”‚ 89.37 ms โ”‚ 89.7 ms โ”‚ 100 โ”‚ 100 - โ”‚ 361 MiB/s โ”‚ 339.5 MiB/s โ”‚ 358 MiB/s โ”‚ 356.7 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 169.7 ms โ”‚ 176.9 ms โ”‚ 171.7 ms โ”‚ 172.1 ms โ”‚ 100 โ”‚ 100 - โ”‚ 188.5 MiB/s โ”‚ 180.8 MiB/s โ”‚ 186.3 MiB/s โ”‚ 185.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 334.2 ms โ”‚ 358.2 ms โ”‚ 339.3 ms โ”‚ 340.6 ms โ”‚ 100 โ”‚ 100 - โ”‚ 95.77 MiB/s โ”‚ 89.36 MiB/s โ”‚ 94.35 MiB/s โ”‚ 93.97 MiB/s โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 672 ms โ”‚ 728.8 ms โ”‚ 688.9 ms โ”‚ 691.1 ms โ”‚ 100 โ”‚ 100 - 47.7 MiB/s โ”‚ 43.99 MiB/s โ”‚ 46.54 MiB/s โ”‚ 46.38 MiB/s โ”‚ โ”‚ -``` - -
- -### On AWS EC2 `m7i.xlarge` with Intel(R) Xeon(R) Platinum 8488C - -Running benchmarks on `Linux 6.14.0-1011-aws x86_64`, compiled with `rustc 1.89.0 (29483883e 2025-08-04)`. - -Component | Peak Median Throughput (`default` feature) | Peak Median Throughput (`parallel` feature) | Impact of number of pieces on performance ---- | --- | --- | --- -Full RLNC Encoder | **48.36 GiB/s** | **16.01 GiB/s** | The number of pieces original data got split into has a **minimal** impact on the encoding speed. -Full RLNC Recoder | **34.39 GiB/s** | **9.58 GiB/s** | Similar to the encoder, the recoder's performance remains largely consistent regardless of how many pieces the original data is split into. -Full RLNC Decoder | **1.929 GiB/s** | **Doesn't yet implement a parallel decoding mode** | As the number of pieces increases, the decoding time increases substantially, leading to a considerable drop in throughput. This indicates that decoding is the most computationally intensive part of the full RLNC scheme, and its performance is inversely proportional to the number of pieces. - -In summary, the full RLNC implementation demonstrates excellent encoding and recoding speeds, consistently achieving GiB/s throughputs with minimal sensitivity to the number of data pieces. The `parallel` feature, leveraging Rust `rayon` data-parallelism framework, also provides good performance for both encoding and recoding. Whether you want to use that feature, completely depends on your usecase. However, decoding remains a much slower operation, with its performance significantly diminishing as the data is split into a greater number of pieces, and currently does **not** implement a parallel decoding algorithm. - -
-Click to view detailed benchmark results ๐Ÿ‘‡ - -#### Full RLNC Encoder - -```bash -# Encoding with AVX512-powered SIMD vector x scalar multiplication - -Timer precision: 22 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ”œโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 16 pieces 24.81 ยตs โ”‚ 86.67 ยตs โ”‚ 28.54 ยตs โ”‚ 30.06 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 41.81 GiB/s โ”‚ 11.97 GiB/s โ”‚ 36.35 GiB/s โ”‚ 34.51 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 32 pieces 27.74 ยตs โ”‚ 77.13 ยตs โ”‚ 29.69 ยตs โ”‚ 31.56 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 36.29 GiB/s โ”‚ 13.05 GiB/s โ”‚ 33.92 GiB/s โ”‚ 31.9 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 64 pieces 19.87 ยตs โ”‚ 38.22 ยตs โ”‚ 20.5 ยตs โ”‚ 22.56 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 49.91 GiB/s โ”‚ 25.94 GiB/s โ”‚ 48.36 GiB/s โ”‚ 43.95 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 128 pieces 20.26 ยตs โ”‚ 45.07 ยตs โ”‚ 25.4 ยตs โ”‚ 26.44 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 48.58 GiB/s โ”‚ 21.84 GiB/s โ”‚ 38.75 GiB/s โ”‚ 37.22 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 256 pieces 24.89 ยตs โ”‚ 41.05 ยตs โ”‚ 25.31 ยตs โ”‚ 26.52 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 39.39 GiB/s โ”‚ 23.89 GiB/s โ”‚ 38.74 GiB/s โ”‚ 36.97 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 16 pieces 775.1 ยตs โ”‚ 1.759 ms โ”‚ 827.3 ยตs โ”‚ 851.2 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 21.41 GiB/s โ”‚ 9.432 GiB/s โ”‚ 20.06 GiB/s โ”‚ 19.5 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 32 pieces 611.6 ยตs โ”‚ 1.477 ms โ”‚ 661.9 ยตs โ”‚ 681.1 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 26.34 GiB/s โ”‚ 10.9 GiB/s โ”‚ 24.34 GiB/s โ”‚ 23.65 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 64 pieces 625.1 ยตs โ”‚ 1.524 ms โ”‚ 665.5 ยตs โ”‚ 687.9 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 25.38 GiB/s โ”‚ 10.4 GiB/s โ”‚ 23.84 GiB/s โ”‚ 23.06 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 128 pieces 633.9 ยตs โ”‚ 1.388 ms โ”‚ 669.5 ยตs โ”‚ 686.8 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 24.84 GiB/s โ”‚ 11.33 GiB/s โ”‚ 23.51 GiB/s โ”‚ 22.92 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 256 pieces 629.4 ยตs โ”‚ 1.431 ms โ”‚ 659.2 ยตs โ”‚ 680.6 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 24.92 GiB/s โ”‚ 10.95 GiB/s โ”‚ 23.79 GiB/s โ”‚ 23.04 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 16 pieces 2.324 ms โ”‚ 4.714 ms โ”‚ 2.541 ms โ”‚ 2.583 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 14.28 GiB/s โ”‚ 7.043 GiB/s โ”‚ 13.06 GiB/s โ”‚ 12.85 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 32 pieces 1.634 ms โ”‚ 3.483 ms โ”‚ 1.771 ms โ”‚ 1.821 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 19.71 GiB/s โ”‚ 9.251 GiB/s โ”‚ 18.19 GiB/s โ”‚ 17.69 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 64 pieces 1.32 ms โ”‚ 3.311 ms โ”‚ 1.446 ms โ”‚ 1.502 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 24.03 GiB/s โ”‚ 9.584 GiB/s โ”‚ 21.94 GiB/s โ”‚ 21.12 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 128 pieces 1.296 ms โ”‚ 3.297 ms โ”‚ 1.351 ms โ”‚ 1.41 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 24.29 GiB/s โ”‚ 9.552 GiB/s โ”‚ 23.3 GiB/s โ”‚ 22.32 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.301 ms โ”‚ 3.217 ms โ”‚ 1.375 ms โ”‚ 1.431 ms โ”‚ 100 โ”‚ 100 -โ”‚ 24.11 GiB/s โ”‚ 9.751 GiB/s โ”‚ 22.81 GiB/s โ”‚ 21.92 GiB/s โ”‚ โ”‚ -โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ•ฐโ”€ encode_zero_alloc โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 23.6 ยตs โ”‚ 44.12 ยตs โ”‚ 25.18 ยตs โ”‚ 26.42 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 43.95 GiB/s โ”‚ 23.51 GiB/s โ”‚ 41.2 GiB/s โ”‚ 39.26 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 27.18 ยตs โ”‚ 45.54 ยตs โ”‚ 29.34 ยตs โ”‚ 30.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 37.05 GiB/s โ”‚ 22.11 GiB/s โ”‚ 34.32 GiB/s โ”‚ 33.34 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 19.74 ยตs โ”‚ 42.11 ยตs โ”‚ 20.98 ยตs โ”‚ 22.42 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 50.22 GiB/s โ”‚ 23.55 GiB/s โ”‚ 47.25 GiB/s โ”‚ 44.23 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 19.89 ยตs โ”‚ 210.8 ยตs โ”‚ 20.45 ยตs โ”‚ 23.42 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 49.47 GiB/s โ”‚ 4.668 GiB/s โ”‚ 48.11 GiB/s โ”‚ 42.01 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 20.25 ยตs โ”‚ 34.5 ยตs โ”‚ 20.64 ยตs โ”‚ 22.15 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 48.42 GiB/s โ”‚ 28.42 GiB/s โ”‚ 47.51 GiB/s โ”‚ 44.27 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 741.3 ยตs โ”‚ 1.638 ms โ”‚ 806.9 ยตs โ”‚ 834.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.39 GiB/s โ”‚ 10.12 GiB/s โ”‚ 20.57 GiB/s โ”‚ 19.88 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 625.9 ยตs โ”‚ 1.386 ms โ”‚ 666 ยตs โ”‚ 688.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 25.74 GiB/s โ”‚ 11.61 GiB/s โ”‚ 24.19 GiB/s โ”‚ 23.41 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 601.1 ยตs โ”‚ 1.366 ms โ”‚ 632.2 ยตs โ”‚ 656.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 26.39 GiB/s โ”‚ 11.61 GiB/s โ”‚ 25.1 GiB/s โ”‚ 24.17 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 603 ยตs โ”‚ 1.534 ms โ”‚ 630.8 ยตs โ”‚ 657.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 26.11 GiB/s โ”‚ 10.25 GiB/s โ”‚ 24.96 GiB/s โ”‚ 23.96 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 599.2 ยตs โ”‚ 1.56 ms โ”‚ 631.1 ยตs โ”‚ 655.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 26.17 GiB/s โ”‚ 10.05 GiB/s โ”‚ 24.85 GiB/s โ”‚ 23.92 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 2.268 ms โ”‚ 3.968 ms โ”‚ 2.562 ms โ”‚ 2.596 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.63 GiB/s โ”‚ 8.367 GiB/s โ”‚ 12.95 GiB/s โ”‚ 12.78 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 1.593 ms โ”‚ 3.43 ms โ”‚ 1.771 ms โ”‚ 1.848 ms โ”‚ 100 โ”‚ 100 - โ”‚ 20.22 GiB/s โ”‚ 9.395 GiB/s โ”‚ 18.18 GiB/s โ”‚ 17.43 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 1.284 ms โ”‚ 3.278 ms โ”‚ 1.364 ms โ”‚ 1.426 ms โ”‚ 100 โ”‚ 100 - โ”‚ 24.71 GiB/s โ”‚ 9.68 GiB/s โ”‚ 23.26 GiB/s โ”‚ 22.25 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 1.259 ms โ”‚ 3.248 ms โ”‚ 1.338 ms โ”‚ 1.405 ms โ”‚ 100 โ”‚ 100 - โ”‚ 25.01 GiB/s โ”‚ 9.696 GiB/s โ”‚ 23.53 GiB/s โ”‚ 22.41 GiB/s โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.243 ms โ”‚ 3.244 ms โ”‚ 1.327 ms โ”‚ 1.39 ms โ”‚ 100 โ”‚ 100 - 25.23 GiB/s โ”‚ 9.67 GiB/s โ”‚ 23.63 GiB/s โ”‚ 22.55 GiB/s โ”‚ โ”‚ - -# --------------------------------------------------------------------------------------------------------------------------- -# Encoding with `rayon` data-parallelism, also using AVX512 intrinsics for faster vector x scalar multiplication - -Timer precision: 22 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ”œโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 16 pieces 263.9 ยตs โ”‚ 850.2 ยตs โ”‚ 303.8 ยตs โ”‚ 312.9 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 3.931 GiB/s โ”‚ 1.22 GiB/s โ”‚ 3.414 GiB/s โ”‚ 3.315 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 48 โ”‚ 1 โ”‚ 1.48 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 79.34 KiB โ”‚ 64.01 KiB โ”‚ 64.18 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 53 โ”‚ 1 โ”‚ 1.53 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 79.71 KiB โ”‚ 64.01 KiB โ”‚ 64.18 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 9 โ”‚ 2 โ”‚ 2.07 โ”‚ โ”‚ -โ”‚ โ”‚ 128 KiB โ”‚ 128.5 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 32 pieces 98.18 ยตs โ”‚ 346.5 ยตs โ”‚ 120.4 ยตs โ”‚ 125.2 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 10.25 GiB/s โ”‚ 2.906 GiB/s โ”‚ 8.363 GiB/s โ”‚ 8.04 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 64 pieces 83.89 ยตs โ”‚ 125.9 ยตs โ”‚ 101.7 ยตs โ”‚ 102.5 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 11.82 GiB/s โ”‚ 7.875 GiB/s โ”‚ 9.753 GiB/s โ”‚ 9.676 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.07 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.07 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 128 pieces 61.12 ยตs โ”‚ 98.06 ยตs โ”‚ 74.59 ยตs โ”‚ 75.06 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 16.1 GiB/s โ”‚ 10.03 GiB/s โ”‚ 13.19 GiB/s โ”‚ 13.11 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.155 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.155 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 256 pieces 44.85 ยตs โ”‚ 103.5 ยตs โ”‚ 62.03 ยตs โ”‚ 62.54 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 21.86 GiB/s โ”‚ 9.476 GiB/s โ”‚ 15.81 GiB/s โ”‚ 15.68 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.265 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.265 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 16 pieces 3.699 ms โ”‚ 10.36 ms โ”‚ 4.724 ms โ”‚ 4.874 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 4.487 GiB/s โ”‚ 1.602 GiB/s โ”‚ 3.514 GiB/s โ”‚ 3.405 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 32 pieces 2.681 ms โ”‚ 3.693 ms โ”‚ 3.114 ms โ”‚ 3.146 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 6.008 GiB/s โ”‚ 4.362 GiB/s โ”‚ 5.173 GiB/s โ”‚ 5.12 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 64 pieces 1.576 ms โ”‚ 2.269 ms โ”‚ 1.899 ms โ”‚ 1.891 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 10.06 GiB/s โ”‚ 6.993 GiB/s โ”‚ 8.355 GiB/s โ”‚ 8.388 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 128 pieces 1.04 ms โ”‚ 1.601 ms โ”‚ 1.274 ms โ”‚ 1.281 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 15.13 GiB/s โ”‚ 9.831 GiB/s โ”‚ 12.35 GiB/s โ”‚ 12.28 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 256 pieces 846.1 ยตs โ”‚ 1.505 ms โ”‚ 979.4 ยตs โ”‚ 1.003 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 18.53 GiB/s โ”‚ 10.42 GiB/s โ”‚ 16.01 GiB/s โ”‚ 15.62 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.26 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.26 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 16 pieces 12.98 ms โ”‚ 16.63 ms โ”‚ 14.86 ms โ”‚ 14.86 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 2.556 GiB/s โ”‚ 1.995 GiB/s โ”‚ 2.233 GiB/s โ”‚ 2.233 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 32 pieces 7.963 ms โ”‚ 10.61 ms โ”‚ 8.959 ms โ”‚ 9.074 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 4.046 GiB/s โ”‚ 3.035 GiB/s โ”‚ 3.596 GiB/s โ”‚ 3.551 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 64 pieces 4.078 ms โ”‚ 6.332 ms โ”‚ 4.837 ms โ”‚ 4.854 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 7.782 GiB/s โ”‚ 5.012 GiB/s โ”‚ 6.56 GiB/s โ”‚ 6.537 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1.5 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512.8 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1.5 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512.8 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 128 pieces 2.335 ms โ”‚ 4.001 ms โ”‚ 2.736 ms โ”‚ 2.759 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 13.48 GiB/s โ”‚ 7.87 GiB/s โ”‚ 11.5 GiB/s โ”‚ 11.41 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.731 ms โ”‚ 3.204 ms โ”‚ 2.028 ms โ”‚ 2.049 ms โ”‚ 100 โ”‚ 100 -โ”‚ 18.12 GiB/s โ”‚ 9.789 GiB/s โ”‚ 15.46 GiB/s โ”‚ 15.3 GiB/s โ”‚ โ”‚ -โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ•ฐโ”€ encode_zero_alloc โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 104.3 ยตs โ”‚ 296.1 ยตs โ”‚ 120.4 ยตs โ”‚ 125.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 9.947 GiB/s โ”‚ 3.503 GiB/s โ”‚ 8.615 GiB/s โ”‚ 8.286 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 94.05 ยตs โ”‚ 159.6 ยตs โ”‚ 110.1 ยตs โ”‚ 112.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 10.7 GiB/s โ”‚ 6.308 GiB/s โ”‚ 9.14 GiB/s โ”‚ 8.937 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 81.9 ยตs โ”‚ 139.7 ยตs โ”‚ 97.38 ยตs โ”‚ 97.93 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 12.11 GiB/s โ”‚ 7.097 GiB/s โ”‚ 10.18 GiB/s โ”‚ 10.12 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 1 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 1.484 KiB โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 1 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 1.484 KiB โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 53.72 ยตs โ”‚ 97.23 ยตs โ”‚ 66.51 ยตs โ”‚ 68.19 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.32 GiB/s โ”‚ 10.12 GiB/s โ”‚ 14.8 GiB/s โ”‚ 14.43 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 44.24 ยตs โ”‚ 215.4 ยตs โ”‚ 56.16 ยตs โ”‚ 59.38 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.16 GiB/s โ”‚ 4.552 GiB/s โ”‚ 17.46 GiB/s โ”‚ 16.51 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 3.802 ms โ”‚ 6.21 ms โ”‚ 4.4 ms โ”‚ 4.553 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.365 GiB/s โ”‚ 2.673 GiB/s โ”‚ 3.772 GiB/s โ”‚ 3.645 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 2.482 ms โ”‚ 3.51 ms โ”‚ 2.944 ms โ”‚ 2.971 ms โ”‚ 100 โ”‚ 100 - โ”‚ 6.49 GiB/s โ”‚ 4.589 GiB/s โ”‚ 5.471 GiB/s โ”‚ 5.422 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 1.55 ms โ”‚ 2.248 ms โ”‚ 1.821 ms โ”‚ 1.83 ms โ”‚ 100 โ”‚ 100 - โ”‚ 10.23 GiB/s โ”‚ 7.057 GiB/s โ”‚ 8.71 GiB/s โ”‚ 8.671 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 1.026 ms โ”‚ 1.719 ms โ”‚ 1.188 ms โ”‚ 1.195 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.34 GiB/s โ”‚ 9.16 GiB/s โ”‚ 13.25 GiB/s โ”‚ 13.17 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 823.5 ยตs โ”‚ 1.331 ms โ”‚ 954.4 ยตs โ”‚ 963.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 19.04 GiB/s โ”‚ 11.77 GiB/s โ”‚ 16.43 GiB/s โ”‚ 16.28 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 13.06 ms โ”‚ 16.69 ms โ”‚ 14.63 ms โ”‚ 14.59 ms โ”‚ 100 โ”‚ 100 - โ”‚ 2.541 GiB/s โ”‚ 1.989 GiB/s โ”‚ 2.269 GiB/s โ”‚ 2.275 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 7.74 ms โ”‚ 10.55 ms โ”‚ 8.918 ms โ”‚ 9.009 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.163 GiB/s โ”‚ 3.053 GiB/s โ”‚ 3.613 GiB/s โ”‚ 3.576 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 4.352 ms โ”‚ 6.264 ms โ”‚ 4.988 ms โ”‚ 4.997 ms โ”‚ 100 โ”‚ 100 - โ”‚ 7.292 GiB/s โ”‚ 5.066 GiB/s โ”‚ 6.362 GiB/s โ”‚ 6.351 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 2.311 ms โ”‚ 3.797 ms โ”‚ 2.814 ms โ”‚ 2.787 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.62 GiB/s โ”‚ 8.292 GiB/s โ”‚ 11.19 GiB/s โ”‚ 11.29 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.721 ms โ”‚ 3.313 ms โ”‚ 1.955 ms โ”‚ 1.998 ms โ”‚ 100 โ”‚ 100 - 18.22 GiB/s โ”‚ 9.467 GiB/s โ”‚ 16.04 GiB/s โ”‚ 15.69 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -``` - -#### Full RLNC Recoder - -```bash -# Recoding with AVX512-powered SIMD vector x scalar multiplication - -Timer precision: 22 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ”œโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 17.03 ยตs โ”‚ 41.7 ยตs โ”‚ 19.63 ยตs โ”‚ 19.75 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 32.24 GiB/s โ”‚ 13.17 GiB/s โ”‚ 27.98 GiB/s โ”‚ 27.81 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 14.83 ยตs โ”‚ 29.73 ยตs โ”‚ 15.81 ยตs โ”‚ 16.66 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 34.99 GiB/s โ”‚ 17.46 GiB/s โ”‚ 32.83 GiB/s โ”‚ 31.15 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 12.02 ยตs โ”‚ 27.9 ยตs โ”‚ 14.69 ยตs โ”‚ 14.39 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 42.03 GiB/s โ”‚ 18.11 GiB/s โ”‚ 34.39 GiB/s โ”‚ 35.12 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 18.93 ยตs โ”‚ 39.98 ยตs โ”‚ 21.47 ยตs โ”‚ 22.28 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 26.6 GiB/s โ”‚ 12.59 GiB/s โ”‚ 23.45 GiB/s โ”‚ 22.6 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 46.86 ยตs โ”‚ 70.52 ยตs โ”‚ 52.92 ยตs โ”‚ 53.88 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 11.15 GiB/s โ”‚ 7.415 GiB/s โ”‚ 9.88 GiB/s โ”‚ 9.706 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 506.5 ยตs โ”‚ 731.2 ยตs โ”‚ 614 ยตs โ”‚ 613.8 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 17.35 GiB/s โ”‚ 12.01 GiB/s โ”‚ 14.31 GiB/s โ”‚ 14.31 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 378.7 ยตs โ”‚ 683.8 ยตs โ”‚ 467 ยตs โ”‚ 469.6 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 21.91 GiB/s โ”‚ 12.13 GiB/s โ”‚ 17.77 GiB/s โ”‚ 17.67 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 438.9 ยตs โ”‚ 639.7 ยตs โ”‚ 499.6 ยตs โ”‚ 505.4 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 18.35 GiB/s โ”‚ 12.59 GiB/s โ”‚ 16.12 GiB/s โ”‚ 15.94 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 415.5 ยตs โ”‚ 705.8 ยตs โ”‚ 498.9 ยตs โ”‚ 499 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 19.11 GiB/s โ”‚ 11.25 GiB/s โ”‚ 15.91 GiB/s โ”‚ 15.91 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 447.5 ยตs โ”‚ 695.5 ยตs โ”‚ 528.4 ยตs โ”‚ 532.5 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 17.66 GiB/s โ”‚ 11.36 GiB/s โ”‚ 14.95 GiB/s โ”‚ 14.84 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 1.6 ms โ”‚ 2.096 ms โ”‚ 1.892 ms โ”‚ 1.89 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 10.98 GiB/s โ”‚ 8.382 GiB/s โ”‚ 9.29 GiB/s โ”‚ 9.296 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 1.343 ms โ”‚ 1.752 ms โ”‚ 1.602 ms โ”‚ 1.593 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 12.35 GiB/s โ”‚ 9.473 GiB/s โ”‚ 10.36 GiB/s โ”‚ 10.41 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 1.164 ms โ”‚ 1.785 ms โ”‚ 1.499 ms โ”‚ 1.486 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 13.83 GiB/s โ”‚ 9.028 GiB/s โ”‚ 10.74 GiB/s โ”‚ 10.84 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 1.382 ms โ”‚ 1.619 ms โ”‚ 1.539 ms โ”‚ 1.528 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 11.48 GiB/s โ”‚ 9.801 GiB/s โ”‚ 10.31 GiB/s โ”‚ 10.38 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 1.359 ms โ”‚ 1.842 ms โ”‚ 1.572 ms โ”‚ 1.571 ms โ”‚ 100 โ”‚ 100 -โ”‚ 11.6 GiB/s โ”‚ 8.565 GiB/s โ”‚ 10.03 GiB/s โ”‚ 10.03 GiB/s โ”‚ โ”‚ -โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ•ฐโ”€ recode_zero_alloc โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 14.55 ยตs โ”‚ 22.48 ยตs โ”‚ 16.41 ยตs โ”‚ 17.19 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 37.76 GiB/s โ”‚ 24.43 GiB/s โ”‚ 33.46 GiB/s โ”‚ 31.95 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 12.62 ยตs โ”‚ 26.71 ยตs โ”‚ 15.42 ยตs โ”‚ 15.59 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 41.12 GiB/s โ”‚ 19.43 GiB/s โ”‚ 33.67 GiB/s โ”‚ 33.3 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 14.14 ยตs โ”‚ 25.43 ยตs โ”‚ 14.7 ยตs โ”‚ 15.06 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 35.74 GiB/s โ”‚ 19.87 GiB/s โ”‚ 34.37 GiB/s โ”‚ 33.54 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 18.21 ยตs โ”‚ 36.5 ยตs โ”‚ 18.4 ยตs โ”‚ 19.43 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.65 GiB/s โ”‚ 13.79 GiB/s โ”‚ 27.37 GiB/s โ”‚ 25.92 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 43.54 ยตs โ”‚ 62.17 ยตs โ”‚ 44.52 ยตs โ”‚ 46.21 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 12.01 GiB/s โ”‚ 8.411 GiB/s โ”‚ 11.74 GiB/s โ”‚ 11.31 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 360.5 ยตs โ”‚ 641.8 ยตs โ”‚ 431.8 ยตs โ”‚ 433.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 24.37 GiB/s โ”‚ 13.69 GiB/s โ”‚ 20.35 GiB/s โ”‚ 20.26 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 288.4 ยตs โ”‚ 469.2 ยตs โ”‚ 344.2 ยตs โ”‚ 347.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.77 GiB/s โ”‚ 17.69 GiB/s โ”‚ 24.11 GiB/s โ”‚ 23.91 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 303.6 ยตs โ”‚ 422.1 ยตs โ”‚ 337.2 ยตs โ”‚ 343.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 26.53 GiB/s โ”‚ 19.08 GiB/s โ”‚ 23.89 GiB/s โ”‚ 23.47 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 310.3 ยตs โ”‚ 462.4 ยตs โ”‚ 337.5 ยตs โ”‚ 343.8 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 25.58 GiB/s โ”‚ 17.17 GiB/s โ”‚ 23.52 GiB/s โ”‚ 23.09 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 338 ยตs โ”‚ 454 ยตs โ”‚ 363.1 ยตs โ”‚ 365 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 23.38 GiB/s โ”‚ 17.4 GiB/s โ”‚ 21.76 GiB/s โ”‚ 21.65 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 1.477 ms โ”‚ 1.941 ms โ”‚ 1.785 ms โ”‚ 1.776 ms โ”‚ 100 โ”‚ 100 - โ”‚ 11.89 GiB/s โ”‚ 9.054 GiB/s โ”‚ 9.843 GiB/s โ”‚ 9.896 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 1.378 ms โ”‚ 1.73 ms โ”‚ 1.566 ms โ”‚ 1.559 ms โ”‚ 100 โ”‚ 100 - โ”‚ 12.04 GiB/s โ”‚ 9.595 GiB/s โ”‚ 10.6 GiB/s โ”‚ 10.64 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 1.267 ms โ”‚ 1.644 ms โ”‚ 1.481 ms โ”‚ 1.474 ms โ”‚ 100 โ”‚ 100 - โ”‚ 12.71 GiB/s โ”‚ 9.798 GiB/s โ”‚ 10.88 GiB/s โ”‚ 10.92 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 1.219 ms โ”‚ 1.604 ms โ”‚ 1.479 ms โ”‚ 1.466 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.02 GiB/s โ”‚ 9.896 GiB/s โ”‚ 10.73 GiB/s โ”‚ 10.82 GiB/s โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 1.242 ms โ”‚ 1.636 ms โ”‚ 1.465 ms โ”‚ 1.455 ms โ”‚ 100 โ”‚ 100 - 12.69 GiB/s โ”‚ 9.641 GiB/s โ”‚ 10.76 GiB/s โ”‚ 10.84 GiB/s โ”‚ โ”‚ - -# --------------------------------------------------------------------------------------------------------------------------- -# Recoding with `rayon` data-parallelism, also using AVX512 intrinsics for faster vector x scalar multiplication - -Timer precision: 25 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ”œโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 75.03 ยตs โ”‚ 374.9 ยตs โ”‚ 99.79 ยตs โ”‚ 133.9 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 7.323 GiB/s โ”‚ 1.465 GiB/s โ”‚ 5.505 GiB/s โ”‚ 4.101 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 73.06 ยตs โ”‚ 167.3 ยตs โ”‚ 82.36 ยตs โ”‚ 84.77 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 7.107 GiB/s โ”‚ 3.102 GiB/s โ”‚ 6.304 GiB/s โ”‚ 6.125 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 2 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 33.51 KiB โ”‚ 32.03 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 2 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 33.51 KiB โ”‚ 32.03 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 64.79 ยตs โ”‚ 94.51 ยตs โ”‚ 75.25 ยตs โ”‚ 76.4 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 7.802 GiB/s โ”‚ 5.348 GiB/s โ”‚ 6.717 GiB/s โ”‚ 6.616 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.07 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.07 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 66.55 ยตs โ”‚ 454.6 ยตs โ”‚ 73.57 ยตs โ”‚ 110.9 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 7.568 GiB/s โ”‚ 1.107 GiB/s โ”‚ 6.846 GiB/s โ”‚ 4.541 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.155 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.155 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 79.96 ยตs โ”‚ 432 ยตs โ”‚ 103.1 ยตs โ”‚ 183.1 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 6.54 GiB/s โ”‚ 1.21 GiB/s โ”‚ 5.071 GiB/s โ”‚ 2.855 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.265 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.265 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 1.848 ms โ”‚ 2.755 ms โ”‚ 2.062 ms โ”‚ 2.094 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 4.754 GiB/s โ”‚ 3.189 GiB/s โ”‚ 4.26 GiB/s โ”‚ 4.195 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 1.452 ms โ”‚ 2.173 ms โ”‚ 1.624 ms โ”‚ 1.653 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 5.715 GiB/s โ”‚ 3.819 GiB/s โ”‚ 5.11 GiB/s โ”‚ 5.021 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 1.031 ms โ”‚ 1.481 ms โ”‚ 1.232 ms โ”‚ 1.247 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 7.808 GiB/s โ”‚ 5.438 GiB/s โ”‚ 6.536 GiB/s โ”‚ 6.458 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 795.7 ยตs โ”‚ 1.205 ms โ”‚ 972 ยตs โ”‚ 976.8 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 9.98 GiB/s โ”‚ 6.586 GiB/s โ”‚ 8.17 GiB/s โ”‚ 8.131 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 618.4 ยตs โ”‚ 1.013 ms โ”‚ 825 ยตs โ”‚ 818.1 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 12.78 GiB/s โ”‚ 7.798 GiB/s โ”‚ 9.58 GiB/s โ”‚ 9.661 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.26 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.26 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 4.084 ms โ”‚ 5.697 ms โ”‚ 4.772 ms โ”‚ 4.791 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 4.303 GiB/s โ”‚ 3.085 GiB/s โ”‚ 3.683 GiB/s โ”‚ 3.668 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 3.682 ms โ”‚ 4.882 ms โ”‚ 4.132 ms โ”‚ 4.134 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 4.508 GiB/s โ”‚ 3.4 GiB/s โ”‚ 4.017 GiB/s โ”‚ 4.015 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 2.784 ms โ”‚ 3.752 ms โ”‚ 3.073 ms โ”‚ 3.134 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 5.787 GiB/s โ”‚ 4.293 GiB/s โ”‚ 5.243 GiB/s โ”‚ 5.142 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 1.825 ms โ”‚ 2.803 ms โ”‚ 2.092 ms โ”‚ 2.118 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 8.697 GiB/s โ”‚ 5.662 GiB/s โ”‚ 7.589 GiB/s โ”‚ 7.496 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 1.385 ms โ”‚ 1.934 ms โ”‚ 1.676 ms โ”‚ 1.676 ms โ”‚ 100 โ”‚ 100 -โ”‚ 11.38 GiB/s โ”‚ 8.154 GiB/s โ”‚ 9.413 GiB/s โ”‚ 9.41 GiB/s โ”‚ โ”‚ -โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ•ฐโ”€ recode_zero_alloc โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 77.78 ยตs โ”‚ 470.6 ยตs โ”‚ 99.06 ยตs โ”‚ 170.5 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 7.063 GiB/s โ”‚ 1.167 GiB/s โ”‚ 5.546 GiB/s โ”‚ 3.222 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 66.26 ยตs โ”‚ 366 ยตs โ”‚ 81.98 ยตs โ”‚ 91.98 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 7.837 GiB/s โ”‚ 1.418 GiB/s โ”‚ 6.334 GiB/s โ”‚ 5.645 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 59.85 ยตs โ”‚ 96.22 ยตs โ”‚ 73.08 ยตs โ”‚ 73.55 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 8.445 GiB/s โ”‚ 5.253 GiB/s โ”‚ 6.917 GiB/s โ”‚ 6.872 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 67.66 ยตs โ”‚ 365.1 ยตs โ”‚ 74.93 ยตs โ”‚ 97.23 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 7.444 GiB/s โ”‚ 1.379 GiB/s โ”‚ 6.721 GiB/s โ”‚ 5.18 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 75.64 ยตs โ”‚ 416.1 ยตs โ”‚ 86.26 ยตs โ”‚ 109.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 6.913 GiB/s โ”‚ 1.256 GiB/s โ”‚ 6.062 GiB/s โ”‚ 4.78 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 1.802 ms โ”‚ 2.639 ms โ”‚ 2.142 ms โ”‚ 2.176 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.876 GiB/s โ”‚ 3.33 GiB/s โ”‚ 4.101 GiB/s โ”‚ 4.037 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 1.396 ms โ”‚ 2.156 ms โ”‚ 1.771 ms โ”‚ 1.757 ms โ”‚ 100 โ”‚ 100 - โ”‚ 5.942 GiB/s โ”‚ 3.849 GiB/s โ”‚ 4.685 GiB/s โ”‚ 4.723 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 1.042 ms โ”‚ 1.903 ms โ”‚ 1.318 ms โ”‚ 1.339 ms โ”‚ 100 โ”‚ 100 - โ”‚ 7.73 GiB/s โ”‚ 4.232 GiB/s โ”‚ 6.113 GiB/s โ”‚ 6.017 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 747.3 ยตs โ”‚ 1.157 ms โ”‚ 956.6 ยตs โ”‚ 948.5 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 10.62 GiB/s โ”‚ 6.859 GiB/s โ”‚ 8.301 GiB/s โ”‚ 8.373 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 576.1 ยตs โ”‚ 1.22 ms โ”‚ 739 ยตs โ”‚ 773.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 13.71 GiB/s โ”‚ 6.477 GiB/s โ”‚ 10.69 GiB/s โ”‚ 10.22 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 4.223 ms โ”‚ 5.42 ms โ”‚ 4.722 ms โ”‚ 4.759 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.161 GiB/s โ”‚ 3.243 GiB/s โ”‚ 3.722 GiB/s โ”‚ 3.693 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 3.704 ms โ”‚ 4.893 ms โ”‚ 4.176 ms โ”‚ 4.159 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.481 GiB/s โ”‚ 3.392 GiB/s โ”‚ 3.974 GiB/s โ”‚ 3.991 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 2.725 ms โ”‚ 3.944 ms โ”‚ 3.206 ms โ”‚ 3.22 ms โ”‚ 100 โ”‚ 100 - โ”‚ 5.912 GiB/s โ”‚ 4.085 GiB/s โ”‚ 5.025 GiB/s โ”‚ 5.004 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 1.484 KiB โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 1 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 1.484 KiB โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 1.968 ms โ”‚ 3.462 ms โ”‚ 2.192 ms โ”‚ 2.245 ms โ”‚ 100 โ”‚ 100 - โ”‚ 8.067 GiB/s โ”‚ 4.584 GiB/s โ”‚ 7.24 GiB/s โ”‚ 7.071 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 1.345 ms โ”‚ 2.041 ms โ”‚ 1.675 ms โ”‚ 1.659 ms โ”‚ 100 โ”‚ 100 - 11.72 GiB/s โ”‚ 7.729 GiB/s โ”‚ 9.415 GiB/s โ”‚ 9.506 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -``` - -#### Full RLNC Decoder - -```bash -# Decoding with AVX512-powered SIMD vector x scalar multiplication - -Timer precision: 22 ns -full_rlnc_decoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ decode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 480.7 ยตs โ”‚ 957.7 ยตs โ”‚ 506.3 ยตs โ”‚ 522.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 2.031 GiB/s โ”‚ 1.019 GiB/s โ”‚ 1.929 GiB/s โ”‚ 1.869 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 950.4 ยตs โ”‚ 1.437 ms โ”‚ 990.3 ยตs โ”‚ 1.013 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.028 GiB/s โ”‚ 696.5 MiB/s โ”‚ 1010 MiB/s โ”‚ 987.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 1.735 ms โ”‚ 2.06 ms โ”‚ 1.819 ms โ”‚ 1.84 ms โ”‚ 100 โ”‚ 100 - โ”‚ 578.5 MiB/s โ”‚ 487.2 MiB/s โ”‚ 551.7 MiB/s โ”‚ 545.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 4.353 ms โ”‚ 4.995 ms โ”‚ 4.577 ms โ”‚ 4.589 ms โ”‚ 100 โ”‚ 100 - โ”‚ 233.3 MiB/s โ”‚ 203.3 MiB/s โ”‚ 221.9 MiB/s โ”‚ 221.2 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 14.71 ms โ”‚ 16.09 ms โ”‚ 15.13 ms โ”‚ 15.15 ms โ”‚ 100 โ”‚ 100 - โ”‚ 72.21 MiB/s โ”‚ 66.04 MiB/s โ”‚ 70.24 MiB/s โ”‚ 70.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 14.58 ms โ”‚ 21.38 ms โ”‚ 14.89 ms โ”‚ 15.03 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.071 GiB/s โ”‚ 748.2 MiB/s โ”‚ 1.048 GiB/s โ”‚ 1.039 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 22.66 ms โ”‚ 24.9 ms โ”‚ 23.69 ms โ”‚ 23.68 ms โ”‚ 100 โ”‚ 100 - โ”‚ 705.9 MiB/s โ”‚ 642.4 MiB/s โ”‚ 675.3 MiB/s โ”‚ 675.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 44.49 ms โ”‚ 48.41 ms โ”‚ 45.44 ms โ”‚ 45.52 ms โ”‚ 100 โ”‚ 100 - โ”‚ 359.6 MiB/s โ”‚ 330.5 MiB/s โ”‚ 352.1 MiB/s โ”‚ 351.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 88.44 ms โ”‚ 92.85 ms โ”‚ 89.9 ms โ”‚ 89.91 ms โ”‚ 100 โ”‚ 100 - โ”‚ 181 MiB/s โ”‚ 172.4 MiB/s โ”‚ 178.1 MiB/s โ”‚ 178.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 183.2 ms โ”‚ 188.8 ms โ”‚ 185.6 ms โ”‚ 185.6 ms โ”‚ 100 โ”‚ 100 - โ”‚ 87.64 MiB/s โ”‚ 85.03 MiB/s โ”‚ 86.5 MiB/s โ”‚ 86.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 50.83 ms โ”‚ 56.01 ms โ”‚ 52.46 ms โ”‚ 52.61 ms โ”‚ 100 โ”‚ 100 - โ”‚ 629.5 MiB/s โ”‚ 571.3 MiB/s โ”‚ 609.9 MiB/s โ”‚ 608.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 68.57 ms โ”‚ 80.56 ms โ”‚ 70.51 ms โ”‚ 71.01 ms โ”‚ 100 โ”‚ 100 - โ”‚ 466.6 MiB/s โ”‚ 397.2 MiB/s โ”‚ 453.8 MiB/s โ”‚ 450.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 103.8 ms โ”‚ 110.1 ms โ”‚ 106.8 ms โ”‚ 106.9 ms โ”‚ 100 โ”‚ 100 - โ”‚ 308 MiB/s โ”‚ 290.5 MiB/s โ”‚ 299.4 MiB/s โ”‚ 299.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 191.8 ms โ”‚ 199.8 ms โ”‚ 195 ms โ”‚ 195.1 ms โ”‚ 100 โ”‚ 100 - โ”‚ 166.8 MiB/s โ”‚ 160.2 MiB/s โ”‚ 164.1 MiB/s โ”‚ 164 MiB/s โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 373 ms โ”‚ 390.6 ms โ”‚ 378.5 ms โ”‚ 378.7 ms โ”‚ 100 โ”‚ 100 - 85.94 MiB/s โ”‚ 82.08 MiB/s โ”‚ 84.69 MiB/s โ”‚ 84.65 MiB/s โ”‚ โ”‚ -``` - -
- -### On AWS EC2 `m7a.large` with AMD EPYC 9R14 - -Running benchmarks on `Linux 6.14.0-1011-aws x86_64`, compiled with `rustc 1.89.0 (29483883e 2025-08-04)`. - -Component | Peak Median Throughput (`default` feature) | Peak Median Throughput (`parallel` feature) | Impact of number of pieces on performance ---- | --- | --- | --- -Full RLNC Encoder | **52.42 GiB/s** | **25.22 GiB/s** | The number of pieces original data got split into has a **minimal** impact on the encoding speed. -Full RLNC Recoder | **45.15 GiB/s** | **8.902 GiB/s** | Similar to the encoder, the recoder's performance remains largely consistent regardless of how many pieces the original data is split into. -Full RLNC Decoder | **2.19 GiB/s** | **Doesn't yet implement a parallel decoding mode** | As the number of pieces increases, the decoding time increases substantially, leading to a considerable drop in throughput. This indicates that decoding is the most computationally intensive part of the full RLNC scheme, and its performance is inversely proportional to the number of pieces. - -In summary, the full RLNC implementation demonstrates excellent encoding and recoding speeds, consistently achieving GiB/s throughputs with minimal sensitivity to the number of data pieces. The `parallel` feature, leveraging Rust `rayon` data-parallelism framework, also provides good performance for both encoding and recoding. Whether you want to use that feature, completely depends on your usecase. However, decoding remains a much slower operation, with its performance significantly diminishing as the data is split into a greater number of pieces, and currently does **not** implement a parallel decoding algorithm. - -
-Click to view detailed benchmark results ๐Ÿ‘‡ - -#### Full RLNC Encoder - -```bash -# Encoding with AVX512-powered SIMD vector x scalar multiplication - -Timer precision: 20 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ”œโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 16 pieces 21.24 ยตs โ”‚ 78.72 ยตs โ”‚ 23.1 ยตs โ”‚ 24.78 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 48.85 GiB/s โ”‚ 13.17 GiB/s โ”‚ 44.9 GiB/s โ”‚ 41.86 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 32 pieces 23.04 ยตs โ”‚ 47.12 ยตs โ”‚ 25.13 ยตs โ”‚ 26.58 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 43.69 GiB/s โ”‚ 21.37 GiB/s โ”‚ 40.06 GiB/s โ”‚ 37.87 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 64 pieces 18.17 ยตs โ”‚ 30.15 ยตs โ”‚ 18.91 ยตs โ”‚ 19.46 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 54.56 GiB/s โ”‚ 32.89 GiB/s โ”‚ 52.42 GiB/s โ”‚ 50.94 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 128 pieces 17.35 ยตs โ”‚ 29.71 ยตs โ”‚ 20.15 ยตs โ”‚ 20.37 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 56.7 GiB/s โ”‚ 33.12 GiB/s โ”‚ 48.83 GiB/s โ”‚ 48.31 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 256 pieces 17.42 ยตs โ”‚ 30.84 ยตs โ”‚ 20.09 ยตs โ”‚ 19.63 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 56.27 GiB/s โ”‚ 31.8 GiB/s โ”‚ 48.82 GiB/s โ”‚ 49.96 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 16 pieces 424.6 ยตs โ”‚ 707.1 ยตs โ”‚ 464.6 ยตs โ”‚ 467.2 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 39.09 GiB/s โ”‚ 23.47 GiB/s โ”‚ 35.73 GiB/s โ”‚ 35.53 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 32 pieces 384.3 ยตs โ”‚ 687.4 ยตs โ”‚ 411.7 ยตs โ”‚ 420.4 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 41.92 GiB/s โ”‚ 23.43 GiB/s โ”‚ 39.13 GiB/s โ”‚ 38.32 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 64 pieces 396.7 ยตs โ”‚ 648.1 ยตs โ”‚ 434.2 ยตs โ”‚ 437.9 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 40 GiB/s โ”‚ 24.48 GiB/s โ”‚ 36.54 GiB/s โ”‚ 36.23 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 128 pieces 394 ยตs โ”‚ 650.5 ยตs โ”‚ 440.1 ยตs โ”‚ 481.3 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 39.96 GiB/s โ”‚ 24.2 GiB/s โ”‚ 35.77 GiB/s โ”‚ 32.71 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 256 pieces 393.3 ยตs โ”‚ 732.7 ยตs โ”‚ 436 ยตs โ”‚ 439 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 39.88 GiB/s โ”‚ 21.4 GiB/s โ”‚ 35.97 GiB/s โ”‚ 35.72 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 16 pieces 1.206 ms โ”‚ 2.327 ms โ”‚ 1.337 ms โ”‚ 1.343 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 27.51 GiB/s โ”‚ 14.26 GiB/s โ”‚ 24.82 GiB/s โ”‚ 24.71 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 32 pieces 1.176 ms โ”‚ 1.351 ms โ”‚ 1.253 ms โ”‚ 1.256 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 27.38 GiB/s โ”‚ 23.85 GiB/s โ”‚ 25.71 GiB/s โ”‚ 25.64 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 64 pieces 1.364 ms โ”‚ 1.754 ms โ”‚ 1.541 ms โ”‚ 1.537 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 23.25 GiB/s โ”‚ 18.08 GiB/s โ”‚ 20.58 GiB/s โ”‚ 20.64 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 128 pieces 1.428 ms โ”‚ 1.891 ms โ”‚ 1.513 ms โ”‚ 1.544 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 22.04 GiB/s โ”‚ 16.65 GiB/s โ”‚ 20.8 GiB/s โ”‚ 20.39 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.483 ms โ”‚ 1.845 ms โ”‚ 1.582 ms โ”‚ 1.605 ms โ”‚ 100 โ”‚ 100 -โ”‚ 21.14 GiB/s โ”‚ 17 GiB/s โ”‚ 19.82 GiB/s โ”‚ 19.54 GiB/s โ”‚ โ”‚ -โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ•ฐโ”€ encode_zero_alloc โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 20.69 ยตs โ”‚ 42.29 ยตs โ”‚ 22.3 ยตs โ”‚ 23.28 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 50.12 GiB/s โ”‚ 24.53 GiB/s โ”‚ 46.51 GiB/s โ”‚ 44.56 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 21.49 ยตs โ”‚ 41.1 ยตs โ”‚ 22.38 ยตs โ”‚ 24.16 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 46.84 GiB/s โ”‚ 24.49 GiB/s โ”‚ 44.98 GiB/s โ”‚ 41.68 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 17.79 ยตs โ”‚ 37.24 ยตs โ”‚ 19.58 ยตs โ”‚ 21.14 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 55.72 GiB/s โ”‚ 26.62 GiB/s โ”‚ 50.63 GiB/s โ”‚ 46.9 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 16.87 ยตs โ”‚ 32.84 ยตs โ”‚ 17.43 ยตs โ”‚ 19.55 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 58.32 GiB/s โ”‚ 29.96 GiB/s โ”‚ 56.44 GiB/s โ”‚ 50.33 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 17.06 ยตs โ”‚ 31.73 ยตs โ”‚ 17.47 ยตs โ”‚ 19 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 57.46 GiB/s โ”‚ 30.91 GiB/s โ”‚ 56.11 GiB/s โ”‚ 51.61 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 409.2 ยตs โ”‚ 581.7 ยตs โ”‚ 456 ยตs โ”‚ 461.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 40.56 GiB/s โ”‚ 28.53 GiB/s โ”‚ 36.4 GiB/s โ”‚ 36 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 389.4 ยตs โ”‚ 581.4 ยตs โ”‚ 414.4 ยตs โ”‚ 419 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 41.37 GiB/s โ”‚ 27.71 GiB/s โ”‚ 38.88 GiB/s โ”‚ 38.45 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 390.4 ยตs โ”‚ 636.5 ยตs โ”‚ 408.1 ยตs โ”‚ 414.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 40.64 GiB/s โ”‚ 24.93 GiB/s โ”‚ 38.87 GiB/s โ”‚ 38.29 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 388.3 ยตs โ”‚ 628.6 ยตs โ”‚ 405.3 ยตs โ”‚ 416.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 40.54 GiB/s โ”‚ 25.05 GiB/s โ”‚ 38.84 GiB/s โ”‚ 37.76 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 388 ยตs โ”‚ 763.2 ยตs โ”‚ 403.7 ยตs โ”‚ 415.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 40.41 GiB/s โ”‚ 20.55 GiB/s โ”‚ 38.85 GiB/s โ”‚ 37.73 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 1.19 ms โ”‚ 1.409 ms โ”‚ 1.268 ms โ”‚ 1.274 ms โ”‚ 100 โ”‚ 100 - โ”‚ 27.88 GiB/s โ”‚ 23.56 GiB/s โ”‚ 26.17 GiB/s โ”‚ 26.04 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 1.125 ms โ”‚ 1.379 ms โ”‚ 1.192 ms โ”‚ 1.201 ms โ”‚ 100 โ”‚ 100 - โ”‚ 28.63 GiB/s โ”‚ 23.35 GiB/s โ”‚ 27.01 GiB/s โ”‚ 26.81 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 1.287 ms โ”‚ 1.622 ms โ”‚ 1.431 ms โ”‚ 1.438 ms โ”‚ 100 โ”‚ 100 - โ”‚ 24.65 GiB/s โ”‚ 19.55 GiB/s โ”‚ 22.17 GiB/s โ”‚ 22.05 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 1.39 ms โ”‚ 1.806 ms โ”‚ 1.456 ms โ”‚ 1.486 ms โ”‚ 100 โ”‚ 100 - โ”‚ 22.64 GiB/s โ”‚ 17.43 GiB/s โ”‚ 21.62 GiB/s โ”‚ 21.19 GiB/s โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.418 ms โ”‚ 1.776 ms โ”‚ 1.507 ms โ”‚ 1.519 ms โ”‚ 100 โ”‚ 100 - 22.12 GiB/s โ”‚ 17.65 GiB/s โ”‚ 20.81 GiB/s โ”‚ 20.64 GiB/s โ”‚ โ”‚ - -# --------------------------------------------------------------------------------------------------------------------------- -# Encoding with `rayon` data-parallelism, also using AVX512 intrinsics for faster vector x scalar multiplication - -Timer precision: 20 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ”œโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 16 pieces 396 ยตs โ”‚ 706.3 ยตs โ”‚ 410.2 ยตs โ”‚ 413.3 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 2.62 GiB/s โ”‚ 1.469 GiB/s โ”‚ 2.529 GiB/s โ”‚ 2.51 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 28 โ”‚ 1 โ”‚ 1.28 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 72.89 KiB โ”‚ 64.01 KiB โ”‚ 64.12 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 33 โ”‚ 1 โ”‚ 1.33 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 73.26 KiB โ”‚ 64.01 KiB โ”‚ 64.12 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 9 โ”‚ 2 โ”‚ 2.07 โ”‚ โ”‚ -โ”‚ โ”‚ 128 KiB โ”‚ 128.5 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 32 pieces 55.26 ยตs โ”‚ 167.7 ยตs โ”‚ 57.96 ยตs โ”‚ 59.69 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 18.22 GiB/s โ”‚ 6.004 GiB/s โ”‚ 17.37 GiB/s โ”‚ 16.87 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 64 pieces 43.04 ยตs โ”‚ 89.11 ยตs โ”‚ 45.5 ยตs โ”‚ 46.35 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 23.04 GiB/s โ”‚ 11.13 GiB/s โ”‚ 21.79 GiB/s โ”‚ 21.39 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.07 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.07 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 128 pieces 36.62 ยตs โ”‚ 108.9 ยตs โ”‚ 39.19 ยตs โ”‚ 48.92 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 26.87 GiB/s โ”‚ 9.039 GiB/s โ”‚ 25.11 GiB/s โ”‚ 20.11 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.155 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.155 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 256 pieces 35.79 ยตs โ”‚ 99.82 ยตs โ”‚ 38.87 ยตs โ”‚ 49.29 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 27.39 GiB/s โ”‚ 9.826 GiB/s โ”‚ 25.22 GiB/s โ”‚ 19.89 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.265 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.265 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 16 pieces 3.455 ms โ”‚ 7.688 ms โ”‚ 3.596 ms โ”‚ 3.788 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 4.804 GiB/s โ”‚ 2.159 GiB/s โ”‚ 4.615 GiB/s โ”‚ 4.381 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 32 pieces 858.9 ยตs โ”‚ 2.324 ms โ”‚ 883.6 ยตs โ”‚ 1.072 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 18.75 GiB/s โ”‚ 6.93 GiB/s โ”‚ 18.23 GiB/s โ”‚ 15.01 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 64 pieces 652.2 ยตs โ”‚ 1.201 ms โ”‚ 672.6 ยตs โ”‚ 696.4 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 24.32 GiB/s โ”‚ 13.2 GiB/s โ”‚ 23.59 GiB/s โ”‚ 22.78 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 128 pieces 562.3 ยตs โ”‚ 1.328 ms โ”‚ 576.3 ยตs โ”‚ 588.4 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 28 GiB/s โ”‚ 11.85 GiB/s โ”‚ 27.32 GiB/s โ”‚ 26.76 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 256 pieces 523.8 ยตs โ”‚ 702.2 ยตs โ”‚ 535.7 ยตs โ”‚ 537.1 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 29.94 GiB/s โ”‚ 22.33 GiB/s โ”‚ 29.28 GiB/s โ”‚ 29.2 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.26 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.26 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 16 pieces 15.57 ms โ”‚ 16.98 ms โ”‚ 16.03 ms โ”‚ 16.07 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 2.131 GiB/s โ”‚ 1.955 GiB/s โ”‚ 2.07 GiB/s โ”‚ 2.064 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 2.001 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 2.001 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 32 pieces 4.267 ms โ”‚ 5.788 ms โ”‚ 4.397 ms โ”‚ 4.489 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 7.552 GiB/s โ”‚ 5.567 GiB/s โ”‚ 7.328 GiB/s โ”‚ 7.177 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 64 pieces 1.639 ms โ”‚ 2.597 ms โ”‚ 1.663 ms โ”‚ 1.676 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 19.36 GiB/s โ”‚ 12.22 GiB/s โ”‚ 19.08 GiB/s โ”‚ 18.92 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1.5 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512.8 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1.5 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512.8 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 128 pieces 1.483 ms โ”‚ 2.117 ms โ”‚ 1.514 ms โ”‚ 1.529 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 21.22 GiB/s โ”‚ 14.87 GiB/s โ”‚ 20.78 GiB/s โ”‚ 20.59 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.373 ms โ”‚ 1.762 ms โ”‚ 1.408 ms โ”‚ 1.432 ms โ”‚ 100 โ”‚ 100 -โ”‚ 22.83 GiB/s โ”‚ 17.8 GiB/s โ”‚ 22.26 GiB/s โ”‚ 21.9 GiB/s โ”‚ โ”‚ -โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ•ฐโ”€ encode_zero_alloc โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 71.34 ยตs โ”‚ 103.2 ยตs โ”‚ 74.32 ยตs โ”‚ 75.09 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 14.54 GiB/s โ”‚ 10.04 GiB/s โ”‚ 13.96 GiB/s โ”‚ 13.81 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 54.67 ยตs โ”‚ 74.2 ยตs โ”‚ 57.68 ยตs โ”‚ 57.97 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.41 GiB/s โ”‚ 13.57 GiB/s โ”‚ 17.46 GiB/s โ”‚ 17.37 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 42.69 ยตs โ”‚ 128.9 ยตs โ”‚ 45.47 ยตs โ”‚ 52.06 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 23.23 GiB/s โ”‚ 7.694 GiB/s โ”‚ 21.81 GiB/s โ”‚ 19.05 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 36.27 ยตs โ”‚ 88.37 ยตs โ”‚ 39.29 ยตs โ”‚ 49.21 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.13 GiB/s โ”‚ 11.13 GiB/s โ”‚ 25.05 GiB/s โ”‚ 20 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 36.09 ยตs โ”‚ 56.51 ยตs โ”‚ 38.65 ยตs โ”‚ 38.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.17 GiB/s โ”‚ 17.35 GiB/s โ”‚ 25.37 GiB/s โ”‚ 25.4 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 3.35 ms โ”‚ 5.831 ms โ”‚ 3.581 ms โ”‚ 3.689 ms โ”‚ 100 โ”‚ 100 - โ”‚ 4.954 GiB/s โ”‚ 2.846 GiB/s โ”‚ 4.634 GiB/s โ”‚ 4.499 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 846.4 ยตs โ”‚ 2.324 ms โ”‚ 865.5 ยตs โ”‚ 950.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 19.03 GiB/s โ”‚ 6.932 GiB/s โ”‚ 18.61 GiB/s โ”‚ 16.95 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 644.9 ยตs โ”‚ 1.293 ms โ”‚ 660.7 ยตs โ”‚ 673.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 24.6 GiB/s โ”‚ 12.26 GiB/s โ”‚ 24.01 GiB/s โ”‚ 23.56 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 560.8 ยตs โ”‚ 1.321 ms โ”‚ 575.2 ยตs โ”‚ 615.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.07 GiB/s โ”‚ 11.91 GiB/s โ”‚ 27.37 GiB/s โ”‚ 25.59 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 523.9 ยตs โ”‚ 1.221 ms โ”‚ 534.9 ยตs โ”‚ 555.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.94 GiB/s โ”‚ 12.84 GiB/s โ”‚ 29.32 GiB/s โ”‚ 28.24 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 15.48 ms โ”‚ 18.52 ms โ”‚ 15.91 ms โ”‚ 15.98 ms โ”‚ 100 โ”‚ 100 - โ”‚ 2.144 GiB/s โ”‚ 1.792 GiB/s โ”‚ 2.086 GiB/s โ”‚ 2.077 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 4.269 ms โ”‚ 6.73 ms โ”‚ 4.347 ms โ”‚ 4.39 ms โ”‚ 100 โ”‚ 100 - โ”‚ 7.548 GiB/s โ”‚ 4.788 GiB/s โ”‚ 7.413 GiB/s โ”‚ 7.339 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 1 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 1.484 KiB โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 1 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 1.484 KiB โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 1.638 ms โ”‚ 3.458 ms โ”‚ 1.667 ms โ”‚ 1.721 ms โ”‚ 100 โ”‚ 100 - โ”‚ 19.36 GiB/s โ”‚ 9.177 GiB/s โ”‚ 19.03 GiB/s โ”‚ 18.44 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 1.467 ms โ”‚ 1.798 ms โ”‚ 1.505 ms โ”‚ 1.515 ms โ”‚ 100 โ”‚ 100 - โ”‚ 21.46 GiB/s โ”‚ 17.51 GiB/s โ”‚ 20.92 GiB/s โ”‚ 20.78 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 1.385 ms โ”‚ 1.963 ms โ”‚ 1.423 ms โ”‚ 1.436 ms โ”‚ 100 โ”‚ 100 - 22.64 GiB/s โ”‚ 15.98 GiB/s โ”‚ 22.04 GiB/s โ”‚ 21.83 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -``` - -#### Full RLNC Recoder - -```bash -# Recoding with AVX512-powered SIMD vector x scalar multiplication - -Timer precision: 20 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ”œโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 12.13 ยตs โ”‚ 27.81 ยตs โ”‚ 13.95 ยตs โ”‚ 14.18 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 45.26 GiB/s โ”‚ 19.75 GiB/s โ”‚ 39.36 GiB/s โ”‚ 38.74 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 10.78 ยตs โ”‚ 22.56 ยตs โ”‚ 11.49 ยตs โ”‚ 11.77 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 48.13 GiB/s โ”‚ 23 GiB/s โ”‚ 45.15 GiB/s โ”‚ 44.11 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 10.97 ยตs โ”‚ 21.87 ยตs โ”‚ 11.24 ยตs โ”‚ 11.35 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 46.04 GiB/s โ”‚ 23.1 GiB/s โ”‚ 44.97 GiB/s โ”‚ 44.51 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 16.88 ยตs โ”‚ 31.08 ยตs โ”‚ 18.42 ยตs โ”‚ 18.62 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 29.82 GiB/s โ”‚ 16.2 GiB/s โ”‚ 27.33 GiB/s โ”‚ 27.04 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 47.64 ยตs โ”‚ 63.27 ยตs โ”‚ 48.8 ยตs โ”‚ 49.92 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 10.97 GiB/s โ”‚ 8.265 GiB/s โ”‚ 10.71 GiB/s โ”‚ 10.47 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 245 ยตs โ”‚ 382.5 ยตs โ”‚ 288.5 ยตs โ”‚ 301.8 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 35.86 GiB/s โ”‚ 22.97 GiB/s โ”‚ 30.45 GiB/s โ”‚ 29.11 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 231.2 ยตs โ”‚ 402.8 ยตs โ”‚ 273.9 ยตs โ”‚ 282.9 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 35.89 GiB/s โ”‚ 20.6 GiB/s โ”‚ 30.3 GiB/s โ”‚ 29.33 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 245.1 ยตs โ”‚ 435.9 ยตs โ”‚ 277.7 ยตs โ”‚ 293.1 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 32.87 GiB/s โ”‚ 18.48 GiB/s โ”‚ 29.01 GiB/s โ”‚ 27.49 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 235.7 ยตs โ”‚ 449.9 ยตs โ”‚ 274.1 ยตs โ”‚ 293.6 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 33.69 GiB/s โ”‚ 17.65 GiB/s โ”‚ 28.96 GiB/s โ”‚ 27.04 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 277.3 ยตs โ”‚ 425.6 ยตs โ”‚ 308.7 ยตs โ”‚ 317.7 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 28.49 GiB/s โ”‚ 18.56 GiB/s โ”‚ 25.6 GiB/s โ”‚ 24.87 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 586.2 ยตs โ”‚ 802 ยตs โ”‚ 692.4 ยตs โ”‚ 696.9 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 29.98 GiB/s โ”‚ 21.91 GiB/s โ”‚ 25.38 GiB/s โ”‚ 25.22 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 549.3 ยตs โ”‚ 805.9 ยตs โ”‚ 636.3 ยตs โ”‚ 649.2 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 30.22 GiB/s โ”‚ 20.59 GiB/s โ”‚ 26.08 GiB/s โ”‚ 25.56 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 661.3 ยตs โ”‚ 883.1 ยตs โ”‚ 723.1 ยตs โ”‚ 730 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 24.36 GiB/s โ”‚ 18.24 GiB/s โ”‚ 22.28 GiB/s โ”‚ 22.07 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 739.9 ยตs โ”‚ 1.062 ms โ”‚ 821.8 ยตs โ”‚ 829.1 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 21.45 GiB/s โ”‚ 14.93 GiB/s โ”‚ 19.31 GiB/s โ”‚ 19.14 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 790.2 ยตs โ”‚ 1.003 ms โ”‚ 858.9 ยตs โ”‚ 868.5 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ 19.96 GiB/s โ”‚ 15.72 GiB/s โ”‚ 18.36 GiB/s โ”‚ 18.16 GiB/s โ”‚ โ”‚ -โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ•ฐโ”€ recode_zero_alloc โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 9.609 ยตs โ”‚ 12.35 ยตs โ”‚ 11.86 ยตs โ”‚ 11.59 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 57.17 GiB/s โ”‚ 44.45 GiB/s โ”‚ 46.29 GiB/s โ”‚ 47.37 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 10.26 ยตs โ”‚ 20.96 ยตs โ”‚ 12.33 ยตs โ”‚ 12.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 50.56 GiB/s โ”‚ 24.76 GiB/s โ”‚ 42.08 GiB/s โ”‚ 42.56 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 10.72 ยตs โ”‚ 21.64 ยตs โ”‚ 11.1 ยตs โ”‚ 11.35 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 47.11 GiB/s โ”‚ 23.35 GiB/s โ”‚ 45.5 GiB/s โ”‚ 44.53 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 17.9 ยตs โ”‚ 28.89 ยตs โ”‚ 18.15 ยตs โ”‚ 18.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.13 GiB/s โ”‚ 17.42 GiB/s โ”‚ 27.73 GiB/s โ”‚ 27.51 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 41.44 ยตs โ”‚ 61.9 ยตs โ”‚ 50.01 ยตs โ”‚ 48.54 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 12.61 GiB/s โ”‚ 8.447 GiB/s โ”‚ 10.45 GiB/s โ”‚ 10.77 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 201.5 ยตs โ”‚ 340.1 ยตs โ”‚ 218.5 ยตs โ”‚ 219.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 43.6 GiB/s โ”‚ 25.83 GiB/s โ”‚ 40.21 GiB/s โ”‚ 40.06 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 187.9 ยตs โ”‚ 395.7 ยตs โ”‚ 218.4 ยตs โ”‚ 222.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 44.17 GiB/s โ”‚ 20.97 GiB/s โ”‚ 38 GiB/s โ”‚ 37.32 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 191 ยตs โ”‚ 360.7 ยตs โ”‚ 211.2 ยตs โ”‚ 211.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 42.17 GiB/s โ”‚ 22.33 GiB/s โ”‚ 38.14 GiB/s โ”‚ 38.06 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 198.6 ยตs โ”‚ 404.6 ยตs โ”‚ 213.6 ยตs โ”‚ 215.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 39.98 GiB/s โ”‚ 19.62 GiB/s โ”‚ 37.17 GiB/s โ”‚ 36.87 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 222.3 ยตs โ”‚ 418.2 ยตs โ”‚ 234.2 ยตs โ”‚ 240.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 35.55 GiB/s โ”‚ 18.89 GiB/s โ”‚ 33.74 GiB/s โ”‚ 32.83 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 560.4 ยตs โ”‚ 753.4 ยตs โ”‚ 655.9 ยตs โ”‚ 659.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 31.36 GiB/s โ”‚ 23.32 GiB/s โ”‚ 26.79 GiB/s โ”‚ 26.64 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 561.3 ยตs โ”‚ 792 ยตs โ”‚ 641.9 ยตs โ”‚ 648.5 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.57 GiB/s โ”‚ 20.96 GiB/s โ”‚ 25.86 GiB/s โ”‚ 25.59 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 636.7 ยตs โ”‚ 886.5 ยตs โ”‚ 720.4 ยตs โ”‚ 734.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 25.3 GiB/s โ”‚ 18.17 GiB/s โ”‚ 22.36 GiB/s โ”‚ 21.93 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 724.1 ยตs โ”‚ 926.7 ยตs โ”‚ 811.5 ยตs โ”‚ 813.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 21.92 GiB/s โ”‚ 17.13 GiB/s โ”‚ 19.56 GiB/s โ”‚ 19.52 GiB/s โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 751.4 ยตs โ”‚ 1.006 ms โ”‚ 805.6 ยตs โ”‚ 818.4 ยตs โ”‚ 100 โ”‚ 100 - 20.99 GiB/s โ”‚ 15.68 GiB/s โ”‚ 19.58 GiB/s โ”‚ 19.27 GiB/s โ”‚ โ”‚ - -# --------------------------------------------------------------------------------------------------------------------------- -# Recoding with `rayon` data-parallelism, also using AVX512 intrinsics for faster vector x scalar multiplication - -Timer precision: 20 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ”œโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 50.2 ยตs โ”‚ 137 ยตs โ”‚ 73 ยตs โ”‚ 69.75 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 10.94 GiB/s โ”‚ 4.01 GiB/s โ”‚ 7.526 GiB/s โ”‚ 7.877 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1.5 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.75 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1.5 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.01 KiB โ”‚ 64.01 KiB โ”‚ 64.75 KiB โ”‚ 64.03 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 49.08 ยตs โ”‚ 69.48 ยตs โ”‚ 58.33 ยตs โ”‚ 58.81 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 10.58 GiB/s โ”‚ 7.474 GiB/s โ”‚ 8.902 GiB/s โ”‚ 8.829 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.03 KiB โ”‚ 32.06 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 42.36 ยตs โ”‚ 67.97 ยตs โ”‚ 59.55 ยตs โ”‚ 58.57 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 11.93 GiB/s โ”‚ 7.437 GiB/s โ”‚ 8.488 GiB/s โ”‚ 8.63 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.07 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.06 KiB โ”‚ 16.07 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 40.83 ยตs โ”‚ 74.68 ยตs โ”‚ 65.13 ยตs โ”‚ 56.61 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 12.33 GiB/s โ”‚ 6.744 GiB/s โ”‚ 7.733 GiB/s โ”‚ 8.896 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.155 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.125 KiB โ”‚ 8.155 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 69.18 ยตs โ”‚ 108.9 ยตs โ”‚ 89.66 ยตs โ”‚ 86.59 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 7.559 GiB/s โ”‚ 4.801 GiB/s โ”‚ 5.832 GiB/s โ”‚ 6.039 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.265 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.25 KiB โ”‚ 4.265 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 686.3 ยตs โ”‚ 2.291 ms โ”‚ 717.2 ยตs โ”‚ 766.2 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 12.8 GiB/s โ”‚ 3.835 GiB/s โ”‚ 12.25 GiB/s โ”‚ 11.47 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 632.7 ยตs โ”‚ 769.1 ยตs โ”‚ 656.3 ยตs โ”‚ 658.5 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 13.12 GiB/s โ”‚ 10.79 GiB/s โ”‚ 12.64 GiB/s โ”‚ 12.6 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 457.9 ยตs โ”‚ 986.2 ยตs โ”‚ 489.3 ยตs โ”‚ 495.1 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 17.59 GiB/s โ”‚ 8.17 GiB/s โ”‚ 16.46 GiB/s โ”‚ 16.27 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 369.6 ยตs โ”‚ 961.7 ยตs โ”‚ 395.2 ยตs โ”‚ 421.6 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 21.48 GiB/s โ”‚ 8.258 GiB/s โ”‚ 20.09 GiB/s โ”‚ 18.83 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ 128.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 364.9 ยตs โ”‚ 879.8 ยตs โ”‚ 387 ยตs โ”‚ 416.8 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 21.65 GiB/s โ”‚ 8.984 GiB/s โ”‚ 20.42 GiB/s โ”‚ 18.96 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.26 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.25 KiB โ”‚ 64.26 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 1.876 ms โ”‚ 2.534 ms โ”‚ 2.115 ms โ”‚ 2.156 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 9.369 GiB/s โ”‚ 6.936 GiB/s โ”‚ 8.308 GiB/s โ”‚ 8.151 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 1.546 ms โ”‚ 2.285 ms โ”‚ 1.63 ms โ”‚ 1.656 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 10.73 GiB/s โ”‚ 7.264 GiB/s โ”‚ 10.18 GiB/s โ”‚ 10.02 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 1.067 ms โ”‚ 1.728 ms โ”‚ 1.1 ms โ”‚ 1.119 ms โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 15.1 GiB/s โ”‚ 9.325 GiB/s โ”‚ 14.64 GiB/s โ”‚ 14.38 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ -โ”‚ โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 863.3 ยตs โ”‚ 1.407 ms โ”‚ 890.8 ยตs โ”‚ 915 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ โ”‚ 18.38 GiB/s โ”‚ 11.27 GiB/s โ”‚ 17.82 GiB/s โ”‚ 17.35 GiB/s โ”‚ โ”‚ -โ”‚ โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.02 โ”‚ โ”‚ -โ”‚ โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ 256.1 KiB โ”‚ โ”‚ -โ”‚ โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ -โ”‚ โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 815.7 ยตs โ”‚ 1.607 ms โ”‚ 855.1 ยตs โ”‚ 877.8 ยตs โ”‚ 100 โ”‚ 100 -โ”‚ 19.34 GiB/s โ”‚ 9.812 GiB/s โ”‚ 18.45 GiB/s โ”‚ 17.97 GiB/s โ”‚ โ”‚ -โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 1 โ”‚ 1 โ”‚ 1 โ”‚ 1.01 โ”‚ โ”‚ -โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ 128.2 KiB โ”‚ โ”‚ -โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ -โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ -โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -โ•ฐโ”€ recode_zero_alloc โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 53.1 ยตs โ”‚ 82.28 ยตs โ”‚ 58.36 ยตs โ”‚ 59.06 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 10.34 GiB/s โ”‚ 6.677 GiB/s โ”‚ 9.414 GiB/s โ”‚ 9.301 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 53.54 ยตs โ”‚ 131.6 ยตs โ”‚ 57.05 ยตs โ”‚ 68.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 9.699 GiB/s โ”‚ 3.946 GiB/s โ”‚ 9.102 GiB/s โ”‚ 7.613 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ 64 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 40.15 ยตs โ”‚ 115.7 ยตs โ”‚ 59.33 ยตs โ”‚ 69.67 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 12.58 GiB/s โ”‚ 4.368 GiB/s โ”‚ 8.52 GiB/s โ”‚ 7.255 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ 32 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 42.06 ยตs โ”‚ 77.84 ยตs โ”‚ 60.1 ยตs โ”‚ 57.12 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 11.97 GiB/s โ”‚ 6.47 GiB/s โ”‚ 8.38 GiB/s โ”‚ 8.818 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ 16 KiB โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 70.08 ยตs โ”‚ 111.9 ยตs โ”‚ 94.06 ยตs โ”‚ 88.98 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 7.462 GiB/s โ”‚ 4.671 GiB/s โ”‚ 5.559 GiB/s โ”‚ 5.877 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ 8.001 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 659 ยตs โ”‚ 1.507 ms โ”‚ 710.9 ยตs โ”‚ 791.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 13.33 GiB/s โ”‚ 5.831 GiB/s โ”‚ 12.36 GiB/s โ”‚ 11.1 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 591 ยตs โ”‚ 1.348 ms โ”‚ 635.2 ยตs โ”‚ 715.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 14.04 GiB/s โ”‚ 6.156 GiB/s โ”‚ 13.06 GiB/s โ”‚ 11.6 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0.5 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 760 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0.5 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 760 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 421.6 ยตs โ”‚ 1.033 ms โ”‚ 489.9 ยตs โ”‚ 646.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 19.11 GiB/s โ”‚ 7.798 GiB/s โ”‚ 16.44 GiB/s โ”‚ 12.45 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 347.4 ยตs โ”‚ 888.4 ยตs โ”‚ 378.4 ยตs โ”‚ 498.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.85 GiB/s โ”‚ 8.939 GiB/s โ”‚ 20.98 GiB/s โ”‚ 15.92 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 336.4 ยตs โ”‚ 776.2 ยตs โ”‚ 381.2 ยตs โ”‚ 497.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 23.49 GiB/s โ”‚ 10.18 GiB/s โ”‚ 20.73 GiB/s โ”‚ 15.88 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ 128 KiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 1.881 ms โ”‚ 2.296 ms โ”‚ 1.977 ms โ”‚ 1.992 ms โ”‚ 100 โ”‚ 100 - โ”‚ 9.344 GiB/s โ”‚ 7.655 GiB/s โ”‚ 8.888 GiB/s โ”‚ 8.82 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ 4 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 1.544 ms โ”‚ 1.791 ms โ”‚ 1.625 ms โ”‚ 1.636 ms โ”‚ 100 โ”‚ 100 - โ”‚ 10.75 GiB/s โ”‚ 9.265 GiB/s โ”‚ 10.21 GiB/s โ”‚ 10.14 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ 2 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 1.056 ms โ”‚ 1.262 ms โ”‚ 1.087 ms โ”‚ 1.105 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.24 GiB/s โ”‚ 12.76 GiB/s โ”‚ 14.81 GiB/s โ”‚ 14.58 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ 1 MiB โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 863.8 ยตs โ”‚ 985.2 ยตs โ”‚ 893.4 ยตs โ”‚ 900 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.38 GiB/s โ”‚ 16.11 GiB/s โ”‚ 17.77 GiB/s โ”‚ 17.64 GiB/s โ”‚ โ”‚ - โ”‚ max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.01 โ”‚ โ”‚ - โ”‚ 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 15.2 B โ”‚ โ”‚ - โ”‚ dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ 512 KiB โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 819.6 ยตs โ”‚ 944.9 ยตs โ”‚ 854.2 ยตs โ”‚ 860.2 ยตs โ”‚ 100 โ”‚ 100 - 19.25 GiB/s โ”‚ 16.69 GiB/s โ”‚ 18.46 GiB/s โ”‚ 18.34 GiB/s โ”‚ โ”‚ - max alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - alloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 0 โ”‚ 0 โ”‚ 0 โ”‚ 0.02 โ”‚ โ”‚ - 0 B โ”‚ 0 B โ”‚ 0 B โ”‚ 30.4 B โ”‚ โ”‚ - dealloc: โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - 2 โ”‚ 2 โ”‚ 2 โ”‚ 2 โ”‚ โ”‚ - 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ 256 KiB โ”‚ โ”‚ -``` - -#### Full RLNC Decoder - -```bash -# Decoding with AVX512-powered SIMD vector x scalar multiplication - -Timer precision: 20 ns -full_rlnc_decoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ decode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 434.5 ยตs โ”‚ 904 ยตs โ”‚ 446 ยตs โ”‚ 453.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 2.247 GiB/s โ”‚ 1.08 GiB/s โ”‚ 2.19 GiB/s โ”‚ 2.155 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 821 ยตs โ”‚ 1.217 ms โ”‚ 834.3 ยตs โ”‚ 838.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 1.19 GiB/s โ”‚ 822.4 MiB/s โ”‚ 1.171 GiB/s โ”‚ 1.165 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 1.667 ms โ”‚ 1.748 ms โ”‚ 1.681 ms โ”‚ 1.681 ms โ”‚ 100 โ”‚ 100 - โ”‚ 602.1 MiB/s โ”‚ 574.1 MiB/s โ”‚ 597 MiB/s โ”‚ 596.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 3.836 ms โ”‚ 3.914 ms โ”‚ 3.85 ms โ”‚ 3.854 ms โ”‚ 100 โ”‚ 100 - โ”‚ 264.7 MiB/s โ”‚ 259.4 MiB/s โ”‚ 263.8 MiB/s โ”‚ 263.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 12.66 ms โ”‚ 12.88 ms โ”‚ 12.7 ms โ”‚ 12.7 ms โ”‚ 100 โ”‚ 100 - โ”‚ 83.91 MiB/s โ”‚ 82.5 MiB/s โ”‚ 83.66 MiB/s โ”‚ 83.62 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 8.566 ms โ”‚ 16.12 ms โ”‚ 8.655 ms โ”‚ 8.821 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.823 GiB/s โ”‚ 992 MiB/s โ”‚ 1.805 GiB/s โ”‚ 1.771 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 15.34 ms โ”‚ 15.88 ms โ”‚ 15.41 ms โ”‚ 15.43 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.018 GiB/s โ”‚ 1007 MiB/s โ”‚ 1.013 GiB/s โ”‚ 1.012 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 28.61 ms โ”‚ 29.15 ms โ”‚ 28.74 ms โ”‚ 28.75 ms โ”‚ 100 โ”‚ 100 - โ”‚ 559.1 MiB/s โ”‚ 548.9 MiB/s โ”‚ 556.8 MiB/s โ”‚ 556.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 57.11 ms โ”‚ 57.84 ms โ”‚ 57.29 ms โ”‚ 57.32 ms โ”‚ 100 โ”‚ 100 - โ”‚ 280.4 MiB/s โ”‚ 276.8 MiB/s โ”‚ 279.5 MiB/s โ”‚ 279.3 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 119.1 ms โ”‚ 119.9 ms โ”‚ 119.3 ms โ”‚ 119.3 ms โ”‚ 100 โ”‚ 100 - โ”‚ 134.8 MiB/s โ”‚ 133.9 MiB/s โ”‚ 134.6 MiB/s โ”‚ 134.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 33.41 ms โ”‚ 36.07 ms โ”‚ 34.52 ms โ”‚ 34.58 ms โ”‚ 100 โ”‚ 100 - โ”‚ 957.5 MiB/s โ”‚ 886.9 MiB/s โ”‚ 926.7 MiB/s โ”‚ 925.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 50.01 ms โ”‚ 52.75 ms โ”‚ 50.68 ms โ”‚ 50.83 ms โ”‚ 100 โ”‚ 100 - โ”‚ 639.8 MiB/s โ”‚ 606.5 MiB/s โ”‚ 631.3 MiB/s โ”‚ 629.4 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 82.79 ms โ”‚ 88.45 ms โ”‚ 84.02 ms โ”‚ 84.51 ms โ”‚ 100 โ”‚ 100 - โ”‚ 386.5 MiB/s โ”‚ 361.8 MiB/s โ”‚ 380.8 MiB/s โ”‚ 378.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 152.7 ms โ”‚ 172.3 ms โ”‚ 157.3 ms โ”‚ 157.9 ms โ”‚ 100 โ”‚ 100 - โ”‚ 209.5 MiB/s โ”‚ 185.7 MiB/s โ”‚ 203.4 MiB/s โ”‚ 202.7 MiB/s โ”‚ โ”‚ - โ•ฐโ”€ 32.00 MB data split into 256 pieces 298.2 ms โ”‚ 327.6 ms โ”‚ 307 ms โ”‚ 307.6 ms โ”‚ 100 โ”‚ 100 - 107.5 MiB/s โ”‚ 97.86 MiB/s โ”‚ 104.4 MiB/s โ”‚ 104.2 MiB/s โ”‚ โ”‚ -``` - -
- -### Performance Comparison (x86_64 vs aarch64) - -Here's a side-by-side comparison of the peak median throughput between the x86_64 with **AVX2** (`12th Gen Intel(R) Core(TM) i7-1260P`), aarch64 with **NEON** (`AWS EC2 m8g.large` with Graviton4 CPU), x86_64 with **Intel AVX512** (`AWS EC2 m7i.xlarge` with Intel(R) Xeon(R) Platinum 8488C`), and x86_64 with **AMD AVX512** (`AWS EC2 m7a.large` with AMD EPYC 9R14) targets. - -Component | x86_64 AVX2 (`default`) | x86_64 Intel AVX512 (`default`) | x86_64 AMD AVX512 (`default`) | aarch64 NEON (`default`) | x86_64 AVX2 (`parallel`) | x86_64 Intel AVX512 (`parallel`) | x86_64 AMD AVX512 (`parallel`) | aarch64 NEON (`parallel`) -:--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: -**Full RLNC Encoder** | 30.14 GiB/s | 48.36 GiB/s | 52.42 GiB/s | 19.73 GiB/s | 23.39 GiB/s | 16.01 GiB/s | 25.22 GiB/s | 12.95 GiB/s -**Full RLNC Recoder** | 27.26 GiB/s | 34.39 GiB/s | 45.15 GiB/s | 19.2 GiB/s | 12.63 GiB/s | 9.58 GiB/s | 8.902 GiB/s | 10.43 GiB/s -**Full RLNC Decoder** | 1.59 GiB/s | 1.929 GiB/s | 2.19 GiB/s | 0.84 GiB/s | N/A | N/A | N/A | N/A - -The x86_64 architecture with AMD AVX512 optimizations (`m7a.large`) delivers the highest performance across all operations, particularly excelling in default (single-threaded) mode. The Intel AVX512 processor (`m7i.xlarge`) and AMD AVX512 processor (`m7a.large`) both significantly outperform the x86_64 processor with AVX2 optimizations, which in turn generally outperforms the aarch64 architecture with NEON optimizations. Interestingly, for parallel operations, the AMD AVX512 processor outperforms the Intel AVX512 processor for encoding, while the performance varies for recoding operations, likely due to different core configurations and workload characteristics. Decoding remains a serial operation and is fastest on the AMD AVX512 processor. - ## Usage To use `rlnc` library crate in your Rust project, add it as a dependency in your `Cargo.toml`: ```toml [dependencies] -rlnc = "=0.8.5" # On x86_64 and aarch64 targets, it offers fast encoding, recoding and decoding, using SIMD intrinsics. +rlnc = "=0.8.6" # On x86_64 and aarch64 targets, it offers fast encoding, recoding and decoding, using SIMD intrinsics. # or -rlnc = { version = "=0.8.5", features = "parallel" } # Uses `rayon`-based data-parallelism for fast encoding and recoding. Note, this feature, doesn't yet parallelize RLNC decoding. +rlnc = { version = "=0.8.6", features = "parallel" } # Uses `rayon`-based data-parallelism for fast encoding and recoding. Note, this feature, doesn't yet parallelize RLNC decoding. rand = { version = "=0.9.2" } # Required for random number generation ``` diff --git a/benches/full_rlnc_decoder.rs b/benches/full_rlnc_decoder.rs index 16bcc57..a313465 100644 --- a/benches/full_rlnc_decoder.rs +++ b/benches/full_rlnc_decoder.rs @@ -1,16 +1,7 @@ +use criterion::*; use rand::Rng; -use rlnc::{ - RLNCError, - full::{Decoder, Encoder}, -}; -use std::{fmt::Debug, time::Duration}; - -#[global_allocator] -static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); - -fn main() { - divan::Divan::default().bytes_format(divan::counter::BytesFormat::Binary).main(); -} +use rlnc::full::{Decoder, Encoder}; +use std::{fmt::Debug, hint::black_box, time::Duration}; struct RLNCConfig { data_byte_len: usize, @@ -27,16 +18,12 @@ fn bytes_to_human_readable(bytes: usize) -> String { unit_index += 1; } - format!("{:.2} {}", bytes, units[unit_index]) + format!("{:.1}{}", bytes, units[unit_index]) } impl Debug for RLNCConfig { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(&format!( - "{} data split into {} pieces", - &bytes_to_human_readable(self.data_byte_len), - self.piece_count - )) + f.write_str(&format!("{}/{}-pieces", &bytes_to_human_readable(self.data_byte_len), self.piece_count)) } } @@ -103,38 +90,44 @@ const ARGS: &[RLNCConfig] = &[ }, ]; -#[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -fn decode(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { - let mut rng = rand::rng(); - - let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); - let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); - - let num_pieces_to_produce = rlnc_config.piece_count * 2; - let coded_pieces = (0..num_pieces_to_produce).flat_map(|_| encoder.code(&mut rng)).collect::>(); - - bencher - .with_inputs(|| Decoder::new(encoder.get_piece_byte_len(), encoder.get_piece_count()).expect("Failed to create RLNC decoder")) - .input_counter(|decoder| divan::counter::BytesCount::new(decoder.get_full_coded_piece_byte_len() * decoder.get_num_pieces_coded_together())) - .bench_refs(|mut decoder| { - let mut piece_index = 0; - let per_piece_byte_len = coded_pieces.len() / num_pieces_to_produce; - - while piece_index < num_pieces_to_produce { - let coded_piece_begins_at = piece_index * per_piece_byte_len; - let coded_piece_ends_at = coded_piece_begins_at + per_piece_byte_len; - let coded_piece = &coded_pieces[coded_piece_begins_at..coded_piece_ends_at]; - - match divan::black_box(&mut decoder).decode(divan::black_box(coded_piece)) { - Ok(_) => {} - Err(e) => { - if let RLNCError::ReceivedAllPieces = e { - break; - } - } - }; +fn decode(c: &mut Criterion) { + let mut group = c.benchmark_group("decode"); + + for rlnc_config in ARGS { + let mut rng = rand::rng(); + + let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); + let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); + + let num_pieces_to_produce = rlnc_config.piece_count * 2; + let coded_pieces = (0..num_pieces_to_produce).flat_map(|_| encoder.code(&mut rng)).collect::>(); - piece_index += 1; - } + let decoder = Decoder::new(encoder.get_piece_byte_len(), encoder.get_piece_count()).expect("Failed to create RLNC decoder"); + + group.measurement_time(Duration::from_secs(20)); + group.sample_size(100); + + group.throughput(Throughput::Bytes( + (decoder.get_full_coded_piece_byte_len() * decoder.get_num_pieces_coded_together()) as u64, + )); + group.bench_function(format!("{:?}", rlnc_config), move |b| { + b.iter_batched( + || decoder.clone(), + |mut dec| { + let mut coded_pieces_iter = coded_pieces.chunks_exact(dec.get_full_coded_piece_byte_len()); + + while !black_box(&dec).is_already_decoded() { + let coded_piece = unsafe { coded_pieces_iter.next().unwrap_unchecked() }; + let _ = black_box(&mut dec).decode(black_box(coded_piece)); + } + }, + BatchSize::LargeInput, + ); }); + } + + group.finish(); } + +criterion_group!(rlnc_decoder, decode); +criterion_main!(rlnc_decoder); diff --git a/benches/full_rlnc_encoder.rs b/benches/full_rlnc_encoder.rs index fb95bee..f87e033 100644 --- a/benches/full_rlnc_encoder.rs +++ b/benches/full_rlnc_encoder.rs @@ -1,13 +1,7 @@ +use criterion::*; use rand::Rng; use rlnc::full::Encoder; -use std::{fmt::Debug, time::Duration}; - -#[global_allocator] -static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); - -fn main() { - divan::Divan::default().bytes_format(divan::counter::BytesFormat::Binary).main(); -} +use std::{fmt::Debug, hint::black_box, time::Duration}; struct RLNCConfig { data_byte_len: usize, @@ -24,16 +18,12 @@ fn bytes_to_human_readable(bytes: usize) -> String { unit_index += 1; } - format!("{:.2} {}", bytes, units[unit_index]) + format!("{:.1}{}", bytes, units[unit_index]) } impl Debug for RLNCConfig { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(&format!( - "{} data split into {} pieces", - &bytes_to_human_readable(self.data_byte_len), - self.piece_count - )) + f.write_str(&format!("{}/{}-pieces", &bytes_to_human_readable(self.data_byte_len), self.piece_count)) } } @@ -100,34 +90,53 @@ const ARGS: &[RLNCConfig] = &[ }, ]; -#[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -fn encode(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { - let mut rng = rand::rng(); - let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); +fn encode(c: &mut Criterion) { + let mut group = c.benchmark_group("encode"); - let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); + for rlnc_config in ARGS { + let mut rng = rand::rng(); + let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); + let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); + + group.measurement_time(Duration::from_secs(20)); + group.sample_size(100); + + // Number of bytes used as input to encoder + Number of bytes for each coded piece + group.throughput(Throughput::Bytes( + (encoder.get_piece_byte_len() * encoder.get_piece_count() + encoder.get_full_coded_piece_byte_len()) as u64, + )); + group.bench_function(format!("{:?}", rlnc_config), move |b| { + b.iter(|| black_box(&encoder).code(black_box(&mut rng))); + }); + } - bencher - .counter(divan::counter::BytesCount::new( - encoder.get_piece_byte_len() * encoder.get_piece_count() + // Number of bytes used as input to encoder - encoder.get_full_coded_piece_byte_len(), // Number of bytes for each coded piece - )) - .with_inputs(rand::rng) - .bench_refs(|rng| divan::black_box(divan::black_box(&encoder).code(divan::black_box(rng)))); + group.finish(); } -#[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -fn encode_zero_alloc(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { - let mut rng = rand::rng(); - let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); +fn encode_zero_alloc(c: &mut Criterion) { + let mut group = c.benchmark_group("encode_zero_alloc"); - let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); + for rlnc_config in ARGS { + let mut rng = rand::rng(); + let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); - bencher - .counter(divan::counter::BytesCount::new( - encoder.get_piece_byte_len() * encoder.get_piece_count() + // Number of bytes used as input to encoder - encoder.get_full_coded_piece_byte_len(), // Number of bytes for each coded piece - )) - .with_inputs(|| (rand::rng(), vec![0u8; encoder.get_full_coded_piece_byte_len()])) - .bench_refs(|(rng, coded_piece)| divan::black_box(&encoder).code_with_buf(divan::black_box(rng), divan::black_box(coded_piece))); + let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); + let mut full_coded_piece = vec![0u8; encoder.get_full_coded_piece_byte_len()]; + + group.measurement_time(Duration::from_secs(20)); + group.sample_size(100); + + // Number of bytes used as input to encoder + Number of bytes for each coded piece + group.throughput(Throughput::Bytes( + (encoder.get_piece_byte_len() * encoder.get_piece_count() + encoder.get_full_coded_piece_byte_len()) as u64, + )); + group.bench_function(format!("{:?}", rlnc_config), move |b| { + b.iter(|| black_box(&encoder).code_with_buf(black_box(&mut rng), black_box(&mut full_coded_piece))); + }); + } + + group.finish(); } + +criterion_group!(rlnc_encoder, encode, encode_zero_alloc); +criterion_main!(rlnc_encoder); diff --git a/benches/full_rlnc_recoder.rs b/benches/full_rlnc_recoder.rs index 65092b1..6fdf003 100644 --- a/benches/full_rlnc_recoder.rs +++ b/benches/full_rlnc_recoder.rs @@ -1,13 +1,7 @@ +use criterion::*; use rand::Rng; use rlnc::full::{Encoder, Recoder}; -use std::{fmt::Debug, time::Duration}; - -#[global_allocator] -static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); - -fn main() { - divan::Divan::default().bytes_format(divan::counter::BytesFormat::Binary).main(); -} +use std::{fmt::Debug, hint::black_box, time::Duration}; struct RLNCConfig { data_byte_len: usize, @@ -25,13 +19,13 @@ fn bytes_to_human_readable(bytes: usize) -> String { unit_index += 1; } - format!("{:.2} {}", bytes, units[unit_index]) + format!("{:.1}{}", bytes, units[unit_index]) } impl Debug for RLNCConfig { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(&format!( - "{} data split into {} pieces, recoding with {} pieces", + "{}/{}-pieces/{}-pieces", &bytes_to_human_readable(self.data_byte_len), self.piece_count, self.recoding_with_piece_count @@ -117,57 +111,67 @@ const ARGS: &[RLNCConfig] = &[ }, ]; -#[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -fn recode(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { - let mut rng = rand::rng(); - let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); - - let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); - let coded_pieces = (0..rlnc_config.recoding_with_piece_count) - .flat_map(|_| encoder.code(&mut rng)) - .collect::>(); - - bencher - .with_inputs(|| { - ( - rand::rng(), - Recoder::new(coded_pieces.clone(), encoder.get_full_coded_piece_byte_len(), encoder.get_piece_count()).expect("Failed to create RLNC recoder"), - ) - }) - .input_counter(|(_, recoder)| { - divan::counter::BytesCount::new( - recoder.get_full_coded_piece_byte_len() * recoder.get_num_pieces_recoded_together() + // Number of bytes used as input to recoder - recoder.get_full_coded_piece_byte_len(), // Number of bytes for each recoded piece - ) - }) - .bench_refs(|(rng, recoder)| divan::black_box(divan::black_box(recoder).recode(divan::black_box(rng)))); +fn recode(c: &mut Criterion) { + let mut group = c.benchmark_group("recode"); + + for rlnc_config in ARGS { + let mut rng = rand::rng(); + + let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); + let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); + + let coded_pieces = (0..rlnc_config.recoding_with_piece_count) + .flat_map(|_| encoder.code(&mut rng)) + .collect::>(); + let mut recoder = + Recoder::new(coded_pieces.clone(), encoder.get_full_coded_piece_byte_len(), encoder.get_piece_count()).expect("Failed to create RLNC recoder"); + + group.measurement_time(Duration::from_secs(20)); + group.sample_size(100); + + // Number of bytes used as input to recoder + Number of bytes for each recoded piece + group.throughput(Throughput::Bytes( + (recoder.get_full_coded_piece_byte_len() * recoder.get_num_pieces_recoded_together() + recoder.get_full_coded_piece_byte_len()) as u64, + )); + group.bench_function(format!("{:?}", rlnc_config), move |b| { + b.iter(|| black_box(&mut recoder).recode(black_box(&mut rng))); + }); + } + + group.finish(); } -#[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -fn recode_zero_alloc(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { - let mut rng = rand::rng(); - let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); - - let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); - let coded_pieces = (0..rlnc_config.recoding_with_piece_count) - .flat_map(|_| encoder.code(&mut rng)) - .collect::>(); - - bencher - .with_inputs(|| { - ( - rand::rng(), - Recoder::new(coded_pieces.clone(), encoder.get_full_coded_piece_byte_len(), encoder.get_piece_count()).expect("Failed to create RLNC recoder"), - vec![0u8; encoder.get_full_coded_piece_byte_len()], - ) - }) - .input_counter(|(_, recoder, _)| { - divan::counter::BytesCount::new( - recoder.get_full_coded_piece_byte_len() * recoder.get_num_pieces_recoded_together() + // Number of bytes used as input to recoder - recoder.get_full_coded_piece_byte_len(), // Number of bytes for each recoded piece - ) - }) - .bench_refs(|(rng, recoder, recoded_piece)| { - divan::black_box(divan::black_box(recoder).recode_with_buf(divan::black_box(rng), divan::black_box(recoded_piece))) +fn recode_zero_alloc(c: &mut Criterion) { + let mut group = c.benchmark_group("recode_zero_alloc"); + + for rlnc_config in ARGS { + let mut rng = rand::rng(); + + let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); + let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); + + let coded_pieces = (0..rlnc_config.recoding_with_piece_count) + .flat_map(|_| encoder.code(&mut rng)) + .collect::>(); + let mut recoder = + Recoder::new(coded_pieces.clone(), encoder.get_full_coded_piece_byte_len(), encoder.get_piece_count()).expect("Failed to create RLNC recoder"); + + let mut full_recoded_piece = vec![0u8; recoder.get_full_coded_piece_byte_len()]; + + group.measurement_time(Duration::from_secs(20)); + group.sample_size(100); + + // Number of bytes used as input to recoder + Number of bytes for each recoded piece + group.throughput(Throughput::Bytes( + (recoder.get_full_coded_piece_byte_len() * recoder.get_num_pieces_recoded_together() + recoder.get_full_coded_piece_byte_len()) as u64, + )); + group.bench_function(format!("{:?}", rlnc_config), move |b| { + b.iter(|| black_box(&mut recoder).recode_with_buf(black_box(&mut rng), black_box(&mut full_recoded_piece))); }); + } + + group.finish(); } + +criterion_group!(rlnc_recoder, recode, recode_zero_alloc); +criterion_main!(rlnc_recoder); diff --git a/plots/README.md b/plots/README.md deleted file mode 100644 index 3e350c4..0000000 --- a/plots/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# How to generate plots from `divan` benchmark results ? - ->[!NOTE] -> `divan` is benchmark harness we use in `rlnc` library crate. More about `divan` @ . These scripts for visualizing benchmark results are both `rlnc` and `divan` specific. They are not generic. Originally I used Google Gemini 2.5 Pro to generate these scripts. - -1. First create a virtual environment using `venv`. - - ```bash - python -m venv .venv - source .venv/bin/activate # When done with plot generation, run `deactivate` - ``` - -2. Install all the dependencies inside the virtual environment. - - ```bash - pip install -r plots/scripts/requirements.txt - ``` - -3. Apply git patch [visualize-plot-bench-result.patch](./visualize-plot-bench-result.patch) to extend benchmark input parameter set of RLNC encoder, recoder and decoder. This patch also disables custom memory allocator which can track memory allocation when benchmarking encoding, recoding or decoding. But for plotting purposes, we are only interested in throughput for various input configurations, so we can safely disable everything else. - - ```bash - # This patch was generated on git tag v0.8.4 of this crate - # If the benchmark files are not touched after that, this patch should work. - git apply plots/visualize-plot-bench-result.patch - ``` - -4. Run benchmark program and collect console output. - - ```bash - RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --bench full_rlnc_encoder - RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --bench full_rlnc_recoder - RUSTFLAGS="-C target-cpu=native" cargo bench --profile optimized --bench full_rlnc_decoder - ``` - -5. Copy console output of benchmark run; open corresponding Python script, say [encoder](./scripts/plot_encoder_bench_result.py), which plots RLNC Encoder benchmark results; update `benchmark_data` string with the result you copied and you want to visualize. - -6. Save the updated script and run the script to get resulting plot. - - ```bash - python plots/scripts/plot_encoder_bench_result.py - # or, provide desired output filename - python plots/scripts/plot_encoder_bench_result.py rlnc_encoder.png - ``` - -7. Do same for RLNC Recoder or Decoder. - -All scripts are inside [scripts](./scripts) directory. - ---- - -## Performance Benchmarking on x86_64 with AVX2 - -![rlnc-encoder-on-x86_64-with-avx2](./rlnc-encoder-on-x86_64_with-avx2.png) - -![rlnc-recoder-on-x86_64-with-avx2](./rlnc-recoder-on-x86_64_with-avx2.png) - -![rlnc-decoder-on-x86_64-with-avx2](./rlnc-decoder-on-x86_64_with-avx2.png) - -## Performance Benchmarking on Intel x86_64 with AV512 - -![rlnc-encoder-on-x86_64-with-intel-avx512](./rlnc-encoder-on-x86_64_with-intel-avx512.png) - -![rlnc-recoder-on-x86_64-with-intel-avx512](./rlnc-recoder-on-x86_64_with-intel-avx512.png) - -![rlnc-decoder-on-x86_64-with-intel-avx512](./rlnc-decoder-on-x86_64_with-intel-avx512.png) - -## Performance Benchmarking on AMD x86_64 with AV512 - -![rlnc-encoder-on-x86_64-with-amd-avx512](./rlnc-encoder-on-x86_64_with-amd-avx512.png) - -![rlnc-recoder-on-x86_64-with-amd-avx512](./rlnc-recoder-on-x86_64_with-amd-avx512.png) - -![rlnc-decoder-on-x86_64-with-amd-avx512](./rlnc-decoder-on-x86_64_with-amd-avx512.png) - -## Performance Benchmarking on AMD x86_64 with GFNI+AV512 - -![rlnc-encoder-on-x86_64-with-amd-gfni](./rlnc-encoder-on-x86_64_with-amd-gfni.png) - -![rlnc-recoder-on-x86_64-with-amd-gfni](./rlnc-recoder-on-x86_64_with-amd-gfni.png) - -![rlnc-decoder-on-x86_64-with-amd-gfni](./rlnc-decoder-on-x86_64_with-amd-gfni.png) diff --git a/plots/benchmark_decode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png b/plots/benchmark_decode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png new file mode 100644 index 0000000..4605cbd Binary files /dev/null and b/plots/benchmark_decode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png differ diff --git a/plots/benchmark_encode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png b/plots/benchmark_encode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png new file mode 100644 index 0000000..3be89d8 Binary files /dev/null and b/plots/benchmark_encode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png differ diff --git a/plots/benchmark_recode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png b/plots/benchmark_recode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png new file mode 100644 index 0000000..69392b0 Binary files /dev/null and b/plots/benchmark_recode_on_AMD_EPYC_9R14_with_rustc_1.90.0_1159e78c4_2025-09-14.png differ diff --git a/plots/rlnc-decoder-on-x86_64_with-amd-avx512.png b/plots/rlnc-decoder-on-x86_64_with-amd-avx512.png deleted file mode 100644 index 359e097..0000000 Binary files a/plots/rlnc-decoder-on-x86_64_with-amd-avx512.png and /dev/null differ diff --git a/plots/rlnc-decoder-on-x86_64_with-amd-gfni.png b/plots/rlnc-decoder-on-x86_64_with-amd-gfni.png deleted file mode 100644 index 2d31a9b..0000000 Binary files a/plots/rlnc-decoder-on-x86_64_with-amd-gfni.png and /dev/null differ diff --git a/plots/rlnc-decoder-on-x86_64_with-avx2.png b/plots/rlnc-decoder-on-x86_64_with-avx2.png deleted file mode 100644 index 5347a37..0000000 Binary files a/plots/rlnc-decoder-on-x86_64_with-avx2.png and /dev/null differ diff --git a/plots/rlnc-decoder-on-x86_64_with-intel-avx512.png b/plots/rlnc-decoder-on-x86_64_with-intel-avx512.png deleted file mode 100644 index 37d3378..0000000 Binary files a/plots/rlnc-decoder-on-x86_64_with-intel-avx512.png and /dev/null differ diff --git a/plots/rlnc-encoder-on-x86_64_with-amd-avx512.png b/plots/rlnc-encoder-on-x86_64_with-amd-avx512.png deleted file mode 100644 index de50774..0000000 Binary files a/plots/rlnc-encoder-on-x86_64_with-amd-avx512.png and /dev/null differ diff --git a/plots/rlnc-encoder-on-x86_64_with-amd-gfni.png b/plots/rlnc-encoder-on-x86_64_with-amd-gfni.png deleted file mode 100644 index 2829d52..0000000 Binary files a/plots/rlnc-encoder-on-x86_64_with-amd-gfni.png and /dev/null differ diff --git a/plots/rlnc-encoder-on-x86_64_with-avx2.png b/plots/rlnc-encoder-on-x86_64_with-avx2.png deleted file mode 100644 index ba5e886..0000000 Binary files a/plots/rlnc-encoder-on-x86_64_with-avx2.png and /dev/null differ diff --git a/plots/rlnc-encoder-on-x86_64_with-intel-avx512.png b/plots/rlnc-encoder-on-x86_64_with-intel-avx512.png deleted file mode 100644 index 0194b27..0000000 Binary files a/plots/rlnc-encoder-on-x86_64_with-intel-avx512.png and /dev/null differ diff --git a/plots/rlnc-recoder-on-x86_64_with-amd-avx512.png b/plots/rlnc-recoder-on-x86_64_with-amd-avx512.png deleted file mode 100644 index c605d05..0000000 Binary files a/plots/rlnc-recoder-on-x86_64_with-amd-avx512.png and /dev/null differ diff --git a/plots/rlnc-recoder-on-x86_64_with-amd-gfni.png b/plots/rlnc-recoder-on-x86_64_with-amd-gfni.png deleted file mode 100644 index 03ddee3..0000000 Binary files a/plots/rlnc-recoder-on-x86_64_with-amd-gfni.png and /dev/null differ diff --git a/plots/rlnc-recoder-on-x86_64_with-avx2.png b/plots/rlnc-recoder-on-x86_64_with-avx2.png deleted file mode 100644 index 7ff6adf..0000000 Binary files a/plots/rlnc-recoder-on-x86_64_with-avx2.png and /dev/null differ diff --git a/plots/rlnc-recoder-on-x86_64_with-intel-avx512.png b/plots/rlnc-recoder-on-x86_64_with-intel-avx512.png deleted file mode 100644 index cebefc0..0000000 Binary files a/plots/rlnc-recoder-on-x86_64_with-intel-avx512.png and /dev/null differ diff --git a/plots/scripts/plot_benchmark.py b/plots/scripts/plot_benchmark.py new file mode 100644 index 0000000..9d716b8 --- /dev/null +++ b/plots/scripts/plot_benchmark.py @@ -0,0 +1,179 @@ +import json +import matplotlib.pyplot as plt +import collections +import argparse +import re + + +def parse_and_group_data( + file_path: str, unit: str +) -> dict[str, dict[str, dict[str, list[int | float]]]] | None: + """ + Parses a JSON Lines file, groups data by group_name (method), then by size, and calculates throughput. + + Args: + file_path (str): The path to the input .jsonl file. + unit (str): The desired output unit ('MB/s' or 'GB/s'). + + Returns: + dict: A dictionary grouped by group_name, then by size, with sorted benchmark data. + """ + grouped_data = collections.defaultdict(lambda: collections.defaultdict(list)) + + try: + with open(file_path, "r") as f: + for line in f: + if not line.strip(): + continue + try: + data = json.loads(line) + id_parts = data.get("id", "").split("/") + + group_name = id_parts[0] + size_str = id_parts[1] + pieces_str = id_parts[2] + + # Extract size and pieces using regex + size_match = re.match(r"([\d.]+)MB", size_str) + pieces_match = re.match(r"(\d+)-pieces", pieces_str) + if not size_match or not pieces_match: + continue + + size = size_match.group(1) # e.g., '1.0', '16.0', '32.0' + pieces = int(pieces_match.group(1)) + + # --- Throughput Calculation --- + bytes_processed = data["throughput"][0]["per_iteration"] + time_ns = data["typical"]["estimate"] + + if time_ns > 0: + bytes_per_second = bytes_processed / (time_ns * 1e-9) + if unit == "MB/s": + throughput = bytes_per_second / (1024**2) + elif unit == "GB/s": + throughput = bytes_per_second / (1024**3) + else: + throughput = 0 # Should not happen with arg choices + else: + throughput = 0 + + grouped_data[group_name][size].append((pieces, throughput)) + + except (json.JSONDecodeError, KeyError, IndexError, ValueError): + print( + f"Warning: Skipping malformed or incomplete record: {line.strip()}" + ) + + except FileNotFoundError: + print(f"Error: The file '{file_path}' was not found.") + return None + + # --- Sort the data within each group --- + sorted_grouped_data = {} + for group_name, sizes_data in grouped_data.items(): + sorted_grouped_data[group_name] = {} + # Sort sizes numerically + for size in sorted(sizes_data, key=float): + data_list = sizes_data[size] + # Sort by pieces (integer) + data_list.sort(key=lambda x: x[0]) + + # Unzip the sorted data back into separate lists + pieces, throughputs = zip(*data_list) + sorted_grouped_data[group_name][size] = { + "pieces": list(pieces), + "throughputs": list(throughputs), + } + + return sorted_grouped_data + + +def generate_plot( + group_name: str, + data_dict: dict[str, dict[str, list[int | float]]], + unit: str, + title_format: str, +): + """ + Generates and saves a single line plot for a group_name, with lines for each size. + + Args: + group_name (str): The group_name of the plot (e.g., 'encode'). + data_dict (dict): Dictionary with sizes as keys and {'pieces': list, 'throughputs': list} as values. + unit (str): The unit for the y-axis label. + title_format (str): The format string for the title. + """ + if not data_dict: + print(f"Skipping plot for '{group_name}' due to no data.") + return + + plt.figure(figsize=(12, 7)) + + # --- Create the Line Plots for each size --- + for size, data in data_dict.items(): + if not data["pieces"] or not data["throughputs"]: + continue + plt.plot( + data["pieces"], + data["throughputs"], + marker="o", + linestyle="-", + label=f"{size}MB", + ) + + # --- Plot Formatting --- + plt.ylabel(f"Throughput ({unit})", fontsize=12) + plt.xlabel("Number of Pieces", fontsize=12) + plt.title( + title_format.format(group_name=group_name), fontsize=16, fontweight="bold" + ) + plt.grid(True, which="both", linestyle="--", linewidth=0.5) + plt.legend() + plt.tight_layout() + + # --- Save the Plot --- + output_filename = f"benchmark_{group_name}.png" + plt.savefig(output_filename) + plt.close() + + print(f"โœ… Successfully generated plot: {output_filename}") + + +def main(): + """Main function to drive the script.""" + parser = argparse.ArgumentParser( + description="Parse a benchmark JSON Lines file and generate performance line plots grouped by group_name." + ) + parser.add_argument( + "filepath", type=str, help="Path to the newline-delimited JSON file (.jsonl)." + ) + parser.add_argument( + "-u", + "--unit", + type=str, + default="MB/s", + choices=["MB/s", "GB/s"], + help="The unit for throughput on the y-axis (default: MB/s).", + ) + parser.add_argument( + "--title-format", + type=str, + default="Benchmark Results for: {group_name}", + help="The format string for the plot title, with optional {group_name} placeholder (default: 'Benchmark Results for: {group_name}').", + ) + args = parser.parse_args() + + grouped_data = parse_and_group_data(args.filepath, args.unit) + + if not grouped_data: + print("No data was parsed. Exiting.") + exit(1) + + for group_name in grouped_data: + generate_plot( + group_name, grouped_data[group_name], args.unit, args.title_format + ) + + +if __name__ == "__main__": + main() diff --git a/plots/scripts/plot_decoder_bench_result.py b/plots/scripts/plot_decoder_bench_result.py deleted file mode 100644 index 8eaa2e8..0000000 --- a/plots/scripts/plot_decoder_bench_result.py +++ /dev/null @@ -1,187 +0,0 @@ -#!/usr/bin/python - -import sys -import re -import matplotlib.pyplot as plt -import matplotlib.ticker as mticker -from collections import defaultdict -import io - -# Store the decoder benchmark results in a multiline string -benchmark_data = """ -Timer precision: 22 ns -full_rlnc_decoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ decode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 4 pieces 166.8 ยตs โ”‚ 533.5 ยตs โ”‚ 172.9 ยตs โ”‚ 179 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 5.852 GiB/s โ”‚ 1.83 GiB/s โ”‚ 5.647 GiB/s โ”‚ 5.454 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 8 pieces 314.4 ยตs โ”‚ 740.8 ยตs โ”‚ 323.6 ยตs โ”‚ 329.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 3.105 GiB/s โ”‚ 1.318 GiB/s โ”‚ 3.017 GiB/s โ”‚ 2.966 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 589.7 ยตs โ”‚ 649.3 ยตs โ”‚ 611.5 ยตs โ”‚ 611.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 1.656 GiB/s โ”‚ 1.504 GiB/s โ”‚ 1.597 GiB/s โ”‚ 1.598 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 1.158 ms โ”‚ 1.472 ms โ”‚ 1.214 ms โ”‚ 1.269 ms โ”‚ 100 โ”‚ 100 - โ”‚ 864 MiB/s โ”‚ 679.6 MiB/s โ”‚ 823.9 MiB/s โ”‚ 788.3 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 2.482 ms โ”‚ 2.682 ms โ”‚ 2.527 ms โ”‚ 2.532 ms โ”‚ 100 โ”‚ 100 - โ”‚ 404.4 MiB/s โ”‚ 374.3 MiB/s โ”‚ 397.1 MiB/s โ”‚ 396.4 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 5.314 ms โ”‚ 5.938 ms โ”‚ 5.751 ms โ”‚ 5.697 ms โ”‚ 100 โ”‚ 100 - โ”‚ 191.1 MiB/s โ”‚ 171 MiB/s โ”‚ 176.6 MiB/s โ”‚ 178.2 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 15.38 ms โ”‚ 15.95 ms โ”‚ 15.53 ms โ”‚ 15.54 ms โ”‚ 100 โ”‚ 100 - โ”‚ 69.06 MiB/s โ”‚ 66.62 MiB/s โ”‚ 68.42 MiB/s โ”‚ 68.36 MiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 512 pieces 64.87 ms โ”‚ 69 ms โ”‚ 65.06 ms โ”‚ 65.11 ms โ”‚ 100 โ”‚ 100 - โ”‚ 19.27 MiB/s โ”‚ 18.12 MiB/s โ”‚ 19.22 MiB/s โ”‚ 19.2 MiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 4 pieces 1.13 ms โ”‚ 2.426 ms โ”‚ 1.158 ms โ”‚ 1.188 ms โ”‚ 100 โ”‚ 100 - โ”‚ 3.453 GiB/s โ”‚ 1.609 GiB/s โ”‚ 3.372 GiB/s โ”‚ 3.285 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 8 pieces 1.776 ms โ”‚ 3.342 ms โ”‚ 1.8 ms โ”‚ 1.818 ms โ”‚ 100 โ”‚ 100 - โ”‚ 2.198 GiB/s โ”‚ 1.168 GiB/s โ”‚ 2.169 GiB/s โ”‚ 2.148 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 16 pieces 2.964 ms โ”‚ 4.957 ms โ”‚ 2.994 ms โ”‚ 3.018 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.317 GiB/s โ”‚ 806.9 MiB/s โ”‚ 1.304 GiB/s โ”‚ 1.294 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 32 pieces 5.395 ms โ”‚ 7.445 ms โ”‚ 5.831 ms โ”‚ 5.843 ms โ”‚ 100 โ”‚ 100 - โ”‚ 741.5 MiB/s โ”‚ 537.4 MiB/s โ”‚ 686 MiB/s โ”‚ 684.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 64 pieces 10.33 ms โ”‚ 12.51 ms โ”‚ 11.56 ms โ”‚ 11.58 ms โ”‚ 100 โ”‚ 100 - โ”‚ 387.4 MiB/s โ”‚ 319.8 MiB/s โ”‚ 346.1 MiB/s โ”‚ 345.4 MiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 128 pieces 23.05 ms โ”‚ 28.16 ms โ”‚ 23.74 ms โ”‚ 23.87 ms โ”‚ 100 โ”‚ 100 - โ”‚ 174.1 MiB/s โ”‚ 142.5 MiB/s โ”‚ 169.1 MiB/s โ”‚ 168.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 256 pieces 45.81 ms โ”‚ 50.14 ms โ”‚ 48.56 ms โ”‚ 48.53 ms โ”‚ 100 โ”‚ 100 - โ”‚ 88.67 MiB/s โ”‚ 81.02 MiB/s โ”‚ 83.64 MiB/s โ”‚ 83.7 MiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 512 pieces 132.2 ms โ”‚ 133.9 ms โ”‚ 133.2 ms โ”‚ 133.1 ms โ”‚ 100 โ”‚ 100 - โ”‚ 32.13 MiB/s โ”‚ 31.73 MiB/s โ”‚ 31.9 MiB/s โ”‚ 31.91 MiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 4 pieces 2.37 ms โ”‚ 2.726 ms โ”‚ 2.393 ms โ”‚ 2.405 ms โ”‚ 100 โ”‚ 100 - โ”‚ 3.296 GiB/s โ”‚ 2.865 GiB/s โ”‚ 3.263 GiB/s โ”‚ 3.247 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 8 pieces 4.152 ms โ”‚ 6.829 ms โ”‚ 4.327 ms โ”‚ 4.367 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.881 GiB/s โ”‚ 1.143 GiB/s โ”‚ 1.805 GiB/s โ”‚ 1.788 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 16 pieces 6.636 ms โ”‚ 9.798 ms โ”‚ 6.814 ms โ”‚ 6.849 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.177 GiB/s โ”‚ 816.4 MiB/s โ”‚ 1.146 GiB/s โ”‚ 1.14 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 32 pieces 11.24 ms โ”‚ 15.13 ms โ”‚ 11.89 ms โ”‚ 11.93 ms โ”‚ 100 โ”‚ 100 - โ”‚ 711.8 MiB/s โ”‚ 528.6 MiB/s โ”‚ 672.8 MiB/s โ”‚ 670.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 64 pieces 22.75 ms โ”‚ 24.32 ms โ”‚ 23.56 ms โ”‚ 23.59 ms โ”‚ 100 โ”‚ 100 - โ”‚ 351.6 MiB/s โ”‚ 328.9 MiB/s โ”‚ 339.5 MiB/s โ”‚ 339.2 MiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 128 pieces 45.81 ms โ”‚ 47.69 ms โ”‚ 46.86 ms โ”‚ 46.88 ms โ”‚ 100 โ”‚ 100 - โ”‚ 174.9 MiB/s โ”‚ 168 MiB/s โ”‚ 171 MiB/s โ”‚ 170.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 256 pieces 97.82 ms โ”‚ 109.9 ms โ”‚ 98.97 ms โ”‚ 99.63 ms โ”‚ 100 โ”‚ 100 - โ”‚ 82.41 MiB/s โ”‚ 73.3 MiB/s โ”‚ 81.46 MiB/s โ”‚ 80.92 MiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 512 pieces 224 ms โ”‚ 227.9 ms โ”‚ 225.3 ms โ”‚ 225.3 ms โ”‚ 100 โ”‚ 100 - โ”‚ 36.82 MiB/s โ”‚ 36.19 MiB/s โ”‚ 36.6 MiB/s โ”‚ 36.61 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 4 pieces 5.53 ms โ”‚ 6.627 ms โ”‚ 5.642 ms โ”‚ 5.698 ms โ”‚ 100 โ”‚ 100 - โ”‚ 2.825 GiB/s โ”‚ 2.357 GiB/s โ”‚ 2.769 GiB/s โ”‚ 2.741 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 8 pieces 9.49 ms โ”‚ 10.87 ms โ”‚ 9.551 ms โ”‚ 9.593 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.646 GiB/s โ”‚ 1.436 GiB/s โ”‚ 1.635 GiB/s โ”‚ 1.628 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 16.78 ms โ”‚ 19.14 ms โ”‚ 17.13 ms โ”‚ 17.17 ms โ”‚ 100 โ”‚ 100 - โ”‚ 953.1 MiB/s โ”‚ 835.9 MiB/s โ”‚ 933.9 MiB/s โ”‚ 931.3 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 28 ms โ”‚ 31.84 ms โ”‚ 28.2 ms โ”‚ 28.3 ms โ”‚ 100 โ”‚ 100 - โ”‚ 571.4 MiB/s โ”‚ 502.4 MiB/s โ”‚ 567.2 MiB/s โ”‚ 565.3 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 50.23 ms โ”‚ 54.53 ms โ”‚ 50.5 ms โ”‚ 50.73 ms โ”‚ 100 โ”‚ 100 - โ”‚ 318.5 MiB/s โ”‚ 293.4 MiB/s โ”‚ 316.8 MiB/s โ”‚ 315.4 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 99.62 ms โ”‚ 105.7 ms โ”‚ 100.3 ms โ”‚ 100.7 ms โ”‚ 100 โ”‚ 100 - โ”‚ 160.7 MiB/s โ”‚ 151.3 MiB/s โ”‚ 159.5 MiB/s โ”‚ 158.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 204.9 ms โ”‚ 214.1 ms โ”‚ 207.2 ms โ”‚ 207.4 ms โ”‚ 100 โ”‚ 100 - โ”‚ 78.36 MiB/s โ”‚ 75.02 MiB/s โ”‚ 77.5 MiB/s โ”‚ 77.42 MiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 512 pieces 450.7 ms โ”‚ 488.6 ms โ”‚ 456.3 ms โ”‚ 457.1 ms โ”‚ 100 โ”‚ 100 - โ”‚ 36.05 MiB/s โ”‚ 33.25 MiB/s โ”‚ 35.61 MiB/s โ”‚ 35.54 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 4 pieces 20.24 ms โ”‚ 22.47 ms โ”‚ 20.6 ms โ”‚ 20.73 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.543 GiB/s โ”‚ 1.39 GiB/s โ”‚ 1.516 GiB/s โ”‚ 1.506 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 8 pieces 28.68 ms โ”‚ 32.32 ms โ”‚ 29.03 ms โ”‚ 29.15 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.089 GiB/s โ”‚ 990 MiB/s โ”‚ 1.076 GiB/s โ”‚ 1.071 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 45.35 ms โ”‚ 47.58 ms โ”‚ 45.62 ms โ”‚ 45.8 ms โ”‚ 100 โ”‚ 100 - โ”‚ 705.5 MiB/s โ”‚ 672.5 MiB/s โ”‚ 701.3 MiB/s โ”‚ 698.6 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 77.51 ms โ”‚ 79.93 ms โ”‚ 77.81 ms โ”‚ 78.01 ms โ”‚ 100 โ”‚ 100 - โ”‚ 412.8 MiB/s โ”‚ 400.3 MiB/s โ”‚ 411.2 MiB/s โ”‚ 410.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 128.7 ms โ”‚ 143.5 ms โ”‚ 130.2 ms โ”‚ 130.6 ms โ”‚ 100 โ”‚ 100 - โ”‚ 248.6 MiB/s โ”‚ 222.8 MiB/s โ”‚ 245.7 MiB/s โ”‚ 244.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 232.1 ms โ”‚ 264.3 ms โ”‚ 237.6 ms โ”‚ 237.9 ms โ”‚ 100 โ”‚ 100 - โ”‚ 137.8 MiB/s โ”‚ 121.1 MiB/s โ”‚ 134.6 MiB/s โ”‚ 134.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 256 pieces 465.6 ms โ”‚ 571.5 ms โ”‚ 472.9 ms โ”‚ 474.9 ms โ”‚ 100 โ”‚ 100 - โ”‚ 68.86 MiB/s โ”‚ 56.09 MiB/s โ”‚ 67.79 MiB/s โ”‚ 67.5 MiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 512 pieces 970.2 ms โ”‚ 1.253 s โ”‚ 1.002 s โ”‚ 1.006 s โ”‚ 100 โ”‚ 100 - โ”‚ 33.23 MiB/s โ”‚ 25.71 MiB/s โ”‚ 32.18 MiB/s โ”‚ 32.04 MiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 4 pieces 46.93 ms โ”‚ 51.19 ms โ”‚ 48.15 ms โ”‚ 48.31 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1.331 GiB/s โ”‚ 1.22 GiB/s โ”‚ 1.297 GiB/s โ”‚ 1.293 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 8 pieces 62.61 ms โ”‚ 71.21 ms โ”‚ 64.31 ms โ”‚ 64.5 ms โ”‚ 100 โ”‚ 100 - โ”‚ 1022 MiB/s โ”‚ 898.6 MiB/s โ”‚ 995.1 MiB/s โ”‚ 992.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 16 pieces 98.03 ms โ”‚ 119 ms โ”‚ 99.73 ms โ”‚ 100.1 ms โ”‚ 100 โ”‚ 100 - โ”‚ 652.8 MiB/s โ”‚ 537.5 MiB/s โ”‚ 641.7 MiB/s โ”‚ 639.1 MiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 32 pieces 169.4 ms โ”‚ 204 ms โ”‚ 170.8 ms โ”‚ 174.4 ms โ”‚ 100 โ”‚ 100 - โ”‚ 377.6 MiB/s โ”‚ 313.7 MiB/s โ”‚ 374.5 MiB/s โ”‚ 366.9 MiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 64 pieces 306.6 ms โ”‚ 379.2 ms โ”‚ 310.3 ms โ”‚ 323.6 ms โ”‚ 100 โ”‚ 100 - โ”‚ 208.7 MiB/s โ”‚ 168.7 MiB/s โ”‚ 206.2 MiB/s โ”‚ 197.7 MiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 128 pieces 522.2 ms โ”‚ 641.4 ms โ”‚ 543.5 ms โ”‚ 549.5 ms โ”‚ 100 โ”‚ 100 - โ”‚ 122.5 MiB/s โ”‚ 99.8 MiB/s โ”‚ 117.7 MiB/s โ”‚ 116.4 MiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 256 pieces 1.022 s โ”‚ 1.208 s โ”‚ 1.044 s โ”‚ 1.049 s โ”‚ 96 โ”‚ 96 - โ”‚ 62.65 MiB/s โ”‚ 53 MiB/s โ”‚ 61.36 MiB/s โ”‚ 61.04 MiB/s โ”‚ โ”‚ - โ•ฐโ”€ 64.00 MB data split into 512 pieces 2.074 s โ”‚ 2.336 s โ”‚ 2.121 s โ”‚ 2.129 s โ”‚ 47 โ”‚ 47 - 30.97 MiB/s โ”‚ 27.49 MiB/s โ”‚ 30.28 MiB/s โ”‚ 30.17 MiB/s โ”‚ โ”‚ -""" - -def parse_and_save_plot(data: str, output_filename: str): - """ - Parses the decoder benchmark data and saves the median throughput plot to a file. - Handles throughput values in both GiB/s and MiB/s. - """ - results = defaultdict(list) - - config_pattern = re.compile(r'([\d\.]+\s*(?:MB|GB|KB))\s+data split into\s+(\d+)\s+pieces') - - # Regex to capture throughput values with either GiB/s or MiB/s units - throughput_pattern = re.compile( - r'([\d\.]+\s+(?:GiB|MiB)/s)\s+โ”‚\s+' # Group 1: fastest - r'([\d\.]+\s+(?:GiB|MiB)/s)\s+โ”‚\s+' # Group 2: slowest - r'([\d\.]+\s+(?:GiB|MiB)/s)\s+โ”‚\s+' # Group 3: median - r'([\d\.]+\s+(?:GiB|MiB)/s)' # Group 4: mean - ) - - lines = io.StringIO(data).readlines() - - for i, line in enumerate(lines): - config_match = config_pattern.search(line) - if config_match: - data_size = config_match.group(1).strip() - num_pieces = int(config_match.group(2)) - - if i + 1 < len(lines): - throughput_line = lines[i+1] - tp_match = throughput_pattern.search(throughput_line) - - if tp_match: - median_throughput_str = tp_match.group(3).strip() - - # Convert value to GiB/s - if "MiB/s" in median_throughput_str: - value = float(median_throughput_str.replace("MiB/s", "").strip()) - median_throughput_gib = value / 1024 - else: - value = float(median_throughput_str.replace("GiB/s", "").strip()) - median_throughput_gib = value - - results[data_size].append((num_pieces, median_throughput_gib)) - - # --- Plotting Section --- - fig, ax = plt.subplots(figsize=(12, 7)) - - for data_size, values in sorted(results.items()): - values.sort() - pieces = [v[0] for v in values] - throughputs = [v[1] for v in values] - ax.plot(pieces, throughputs, marker='o', linestyle='-', label=f'{data_size} data') - - # --- Formatting the Plot --- - ax.set_xscale('log', base=2) - ax.xaxis.set_major_formatter(mticker.ScalarFormatter()) - ax.set_xticks([4, 8, 16, 32, 64, 128, 256, 512]) - - ax.set_title('RLNC Decoder Median Throughput vs. Number of Pieces', fontsize=16) - ax.set_xlabel('Number of Pieces (log scale)', fontsize=12) - ax.set_ylabel('Median Throughput (GiB/s)', fontsize=12) - - ax.legend(title='Total Data Size') - ax.grid(True, which='both', linestyle='--', linewidth=0.5) - - plt.tight_layout() - - # --- Save the plot to a file --- - plt.savefig(output_filename, dpi=300) - plt.close() - - print(f"Plot successfully saved to {output_filename}") - -if __name__ == '__main__': - # Run the function to generate and save the image - output_filename = sys.argv.pop() if len(sys.argv) == 2 else "rlnc_decoder_median_throughput.png" - parse_and_save_plot(benchmark_data, output_filename) diff --git a/plots/scripts/plot_encoder_bench_result.py b/plots/scripts/plot_encoder_bench_result.py deleted file mode 100644 index a18453d..0000000 --- a/plots/scripts/plot_encoder_bench_result.py +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/python - -import sys -import re -import matplotlib.pyplot as plt -import matplotlib.ticker as mticker -from collections import defaultdict -import io - -# Store the benchmark results in a multiline string -benchmark_data = """ -Timer precision: 23 ns -full_rlnc_encoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ encode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 4 pieces 41.67 ยตs โ”‚ 186.9 ยตs โ”‚ 52.1 ยตs โ”‚ 53.55 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.29 GiB/s โ”‚ 6.53 GiB/s โ”‚ 23.42 GiB/s โ”‚ 22.79 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 8 pieces 35.05 ยตs โ”‚ 83.2 ยตs โ”‚ 47.94 ยตs โ”‚ 47.69 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 31.34 GiB/s โ”‚ 13.2 GiB/s โ”‚ 22.91 GiB/s โ”‚ 23.03 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces 38.21 ยตs โ”‚ 47.02 ยตs โ”‚ 44.66 ยตs โ”‚ 44.45 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.15 GiB/s โ”‚ 22.06 GiB/s โ”‚ 23.22 GiB/s โ”‚ 23.34 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces 34.92 ยตs โ”‚ 46.84 ยตs โ”‚ 37.24 ยตs โ”‚ 37.38 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.83 GiB/s โ”‚ 21.5 GiB/s โ”‚ 27.03 GiB/s โ”‚ 26.93 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces 32.41 ยตs โ”‚ 45.69 ยตs โ”‚ 33.87 ยตs โ”‚ 34.45 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 30.6 GiB/s โ”‚ 21.7 GiB/s โ”‚ 29.28 GiB/s โ”‚ 28.78 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces 33.37 ยตs โ”‚ 60.31 ยตs โ”‚ 34.88 ยตs โ”‚ 35.59 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.49 GiB/s โ”‚ 16.32 GiB/s โ”‚ 28.22 GiB/s โ”‚ 27.65 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces 33.5 ยตs โ”‚ 41.11 ยตs โ”‚ 35.54 ยตs โ”‚ 35.63 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.27 GiB/s โ”‚ 23.85 GiB/s โ”‚ 27.59 GiB/s โ”‚ 27.52 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 512 pieces 35.53 ยตs โ”‚ 43.74 ยตs โ”‚ 36.95 ยตs โ”‚ 37.08 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.56 GiB/s โ”‚ 22.38 GiB/s โ”‚ 26.5 GiB/s โ”‚ 26.4 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 4 pieces 193 ยตs โ”‚ 704.3 ยตs โ”‚ 251.4 ยตs โ”‚ 282 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 25.29 GiB/s โ”‚ 6.932 GiB/s โ”‚ 19.41 GiB/s โ”‚ 17.31 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 8 pieces 197.5 ยตs โ”‚ 1.144 ms โ”‚ 211.6 ยตs โ”‚ 236.5 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.24 GiB/s โ”‚ 3.839 GiB/s โ”‚ 20.76 GiB/s โ”‚ 18.57 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 16 pieces 171.6 ยตs โ”‚ 202.3 ยตs โ”‚ 184.1 ยตs โ”‚ 184 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 24.18 GiB/s โ”‚ 20.51 GiB/s โ”‚ 22.53 GiB/s โ”‚ 22.54 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 32 pieces 138.3 ยตs โ”‚ 820.9 ยตs โ”‚ 150.2 ยตs โ”‚ 168.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.12 GiB/s โ”‚ 4.907 GiB/s โ”‚ 26.81 GiB/s โ”‚ 23.92 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 64 pieces 141.5 ยตs โ”‚ 584.8 ยตs โ”‚ 148.4 ยตs โ”‚ 159.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.03 GiB/s โ”‚ 6.783 GiB/s โ”‚ 26.72 GiB/s โ”‚ 24.8 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 128 pieces 136.8 ยตs โ”‚ 873.7 ยตs โ”‚ 146.1 ยตs โ”‚ 163.5 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.76 GiB/s โ”‚ 4.505 GiB/s โ”‚ 26.94 GiB/s โ”‚ 24.07 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 256 pieces 130.6 ยตs โ”‚ 731.2 ยตs โ”‚ 134.8 ยตs โ”‚ 151 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 30.01 GiB/s โ”‚ 5.363 GiB/s โ”‚ 29.09 GiB/s โ”‚ 25.97 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 512 pieces 131 ยตs โ”‚ 256.9 ยตs โ”‚ 135.8 ยตs โ”‚ 141.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.87 GiB/s โ”‚ 15.23 GiB/s โ”‚ 28.82 GiB/s โ”‚ 27.62 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 4 pieces 430.7 ยตs โ”‚ 1.895 ms โ”‚ 554.2 ยตs โ”‚ 611.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.67 GiB/s โ”‚ 5.152 GiB/s โ”‚ 17.62 GiB/s โ”‚ 15.96 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 8 pieces 396.4 ยตs โ”‚ 1.079 ms โ”‚ 459.7 ยตs โ”‚ 507.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.17 GiB/s โ”‚ 8.138 GiB/s โ”‚ 19.11 GiB/s โ”‚ 17.3 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 16 pieces 354.3 ยตs โ”‚ 814.7 ยตs โ”‚ 382.4 ยตs โ”‚ 425.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 23.42 GiB/s โ”‚ 10.18 GiB/s โ”‚ 21.7 GiB/s โ”‚ 19.49 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 32 pieces 287.6 ยตs โ”‚ 802.1 ยตs โ”‚ 303.2 ยตs โ”‚ 360.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28 GiB/s โ”‚ 10.04 GiB/s โ”‚ 26.56 GiB/s โ”‚ 22.36 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 64 pieces 279.9 ยตs โ”‚ 784.5 ยตs โ”‚ 307.7 ยตs โ”‚ 357.5 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.34 GiB/s โ”‚ 10.11 GiB/s โ”‚ 25.78 GiB/s โ”‚ 22.19 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 128 pieces 286.2 ยตs โ”‚ 756.6 ยตs โ”‚ 301.8 ยตs โ”‚ 355.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.5 GiB/s โ”‚ 10.4 GiB/s โ”‚ 26.08 GiB/s โ”‚ 22.16 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 256 pieces 284.4 ยตs โ”‚ 738.9 ยตs โ”‚ 299 ยตs โ”‚ 346.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.57 GiB/s โ”‚ 10.61 GiB/s โ”‚ 26.22 GiB/s โ”‚ 22.62 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 512 pieces 271.5 ยตs โ”‚ 766.7 ยตs โ”‚ 285.9 ยตs โ”‚ 335.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.82 GiB/s โ”‚ 10.21 GiB/s โ”‚ 27.37 GiB/s โ”‚ 23.34 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 4 pieces 1.256 ms โ”‚ 1.949 ms โ”‚ 1.28 ms โ”‚ 1.327 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.53 GiB/s โ”‚ 10.02 GiB/s โ”‚ 15.25 GiB/s โ”‚ 14.71 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 8 pieces 993.6 ยตs โ”‚ 1.681 ms โ”‚ 1.137 ms โ”‚ 1.152 ms โ”‚ 100 โ”‚ 100 - โ”‚ 17.69 GiB/s โ”‚ 10.45 GiB/s โ”‚ 15.46 GiB/s โ”‚ 15.25 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces 943.1 ยตs โ”‚ 1.515 ms โ”‚ 1.009 ms โ”‚ 1.037 ms โ”‚ 100 โ”‚ 100 - โ”‚ 17.6 GiB/s โ”‚ 10.95 GiB/s โ”‚ 16.43 GiB/s โ”‚ 15.99 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces 918.7 ยตs โ”‚ 1.503 ms โ”‚ 964.5 ยตs โ”‚ 996.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 17.53 GiB/s โ”‚ 10.71 GiB/s โ”‚ 16.7 GiB/s โ”‚ 16.17 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces 890.6 ยตs โ”‚ 1.273 ms โ”‚ 924.4 ยตs โ”‚ 943.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 17.81 GiB/s โ”‚ 12.46 GiB/s โ”‚ 17.16 GiB/s โ”‚ 16.82 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces 893.9 ยตs โ”‚ 1.474 ms โ”‚ 920 ยตs โ”‚ 974.1 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 17.61 GiB/s โ”‚ 10.67 GiB/s โ”‚ 17.11 GiB/s โ”‚ 16.16 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces 895.6 ยตs โ”‚ 1.242 ms โ”‚ 932.7 ยตs โ”‚ 964.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 17.51 GiB/s โ”‚ 12.62 GiB/s โ”‚ 16.81 GiB/s โ”‚ 16.26 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 512 pieces 883.9 ยตs โ”‚ 1.247 ms โ”‚ 911.1 ยตs โ”‚ 928.8 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 17.71 GiB/s โ”‚ 12.54 GiB/s โ”‚ 17.18 GiB/s โ”‚ 16.85 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 4 pieces 2.205 ms โ”‚ 3.882 ms โ”‚ 2.818 ms โ”‚ 2.842 ms โ”‚ 100 โ”‚ 100 - โ”‚ 17.7 GiB/s โ”‚ 10.06 GiB/s โ”‚ 13.85 GiB/s โ”‚ 13.74 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 8 pieces 2.233 ms โ”‚ 2.931 ms โ”‚ 2.489 ms โ”‚ 2.492 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.74 GiB/s โ”‚ 11.99 GiB/s โ”‚ 14.12 GiB/s โ”‚ 14.1 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces 2.109 ms โ”‚ 3.066 ms โ”‚ 2.308 ms โ”‚ 2.334 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.74 GiB/s โ”‚ 10.82 GiB/s โ”‚ 14.38 GiB/s โ”‚ 14.22 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces 2.138 ms โ”‚ 2.405 ms โ”‚ 2.254 ms โ”‚ 2.258 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.06 GiB/s โ”‚ 13.39 GiB/s โ”‚ 14.29 GiB/s โ”‚ 14.27 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces 2.036 ms โ”‚ 2.703 ms โ”‚ 2.159 ms โ”‚ 2.184 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.58 GiB/s โ”‚ 11.74 GiB/s โ”‚ 14.69 GiB/s โ”‚ 14.52 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces 2.04 ms โ”‚ 2.199 ms โ”‚ 2.108 ms โ”‚ 2.111 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.43 GiB/s โ”‚ 14.32 GiB/s โ”‚ 14.93 GiB/s โ”‚ 14.91 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 256 pieces 2.083 ms โ”‚ 2.278 ms โ”‚ 2.118 ms โ”‚ 2.125 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.06 GiB/s โ”‚ 13.77 GiB/s โ”‚ 14.81 GiB/s โ”‚ 14.76 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 512 pieces 2.009 ms โ”‚ 2.576 ms โ”‚ 2.103 ms โ”‚ 2.113 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.58 GiB/s โ”‚ 12.15 GiB/s โ”‚ 14.88 GiB/s โ”‚ 14.81 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 4 pieces 7.026 ms โ”‚ 8.87 ms โ”‚ 7.725 ms โ”‚ 7.728 ms โ”‚ 100 โ”‚ 100 - โ”‚ 11.11 GiB/s โ”‚ 8.806 GiB/s โ”‚ 10.11 GiB/s โ”‚ 10.1 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 8 pieces 4.468 ms โ”‚ 6.341 ms โ”‚ 5.205 ms โ”‚ 5.191 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.73 GiB/s โ”‚ 11.08 GiB/s โ”‚ 13.5 GiB/s โ”‚ 13.54 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 16 pieces 4.367 ms โ”‚ 5.296 ms โ”‚ 4.793 ms โ”‚ 4.78 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.2 GiB/s โ”‚ 12.53 GiB/s โ”‚ 13.85 GiB/s โ”‚ 13.89 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 32 pieces 4.379 ms โ”‚ 4.998 ms โ”‚ 4.757 ms โ”‚ 4.73 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.71 GiB/s โ”‚ 12.89 GiB/s โ”‚ 13.54 GiB/s โ”‚ 13.62 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 64 pieces 4.438 ms โ”‚ 4.861 ms โ”‚ 4.651 ms โ”‚ 4.649 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.3 GiB/s โ”‚ 13.05 GiB/s โ”‚ 13.64 GiB/s โ”‚ 13.65 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 128 pieces 4.125 ms โ”‚ 4.515 ms โ”‚ 4.345 ms โ”‚ 4.343 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.26 GiB/s โ”‚ 13.94 GiB/s โ”‚ 14.49 GiB/s โ”‚ 14.5 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 256 pieces 4 ms โ”‚ 4.499 ms โ”‚ 4.295 ms โ”‚ 4.287 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.68 GiB/s โ”‚ 13.94 GiB/s โ”‚ 14.6 GiB/s โ”‚ 14.63 GiB/s โ”‚ โ”‚ - โ•ฐโ”€ 64.00 MB data split into 512 pieces 4.035 ms โ”‚ 5.133 ms โ”‚ 4.26 ms โ”‚ 4.277 ms โ”‚ 100 โ”‚ 100 - 15.51 GiB/s โ”‚ 12.19 GiB/s โ”‚ 14.69 GiB/s โ”‚ 14.63 GiB/s โ”‚ โ”‚ -""" - -def parse_and_save_plot(data: str, output_filename: str): - """ - Parses the benchmark data and saves the median throughput plot to a file. - """ - results = defaultdict(list) - - config_pattern = re.compile(r'([\d\.]+\s*(?:MB|GB|KB))\s+data split into\s+(\d+)\s+pieces') - - throughput_pattern = re.compile( - r'([\d\.]+\s+GiB/s)\s+โ”‚\s+' - r'([\d\.]+\s+GiB/s)\s+โ”‚\s+' - r'([\d\.]+\s+GiB/s)\s+โ”‚\s+' - r'([\d\.]+\s+GiB/s)' - ) - - lines = io.StringIO(data).readlines() - - for i, line in enumerate(lines): - config_match = config_pattern.search(line) - if config_match: - data_size = config_match.group(1) - num_pieces = int(config_match.group(2)) - - if i + 1 < len(lines): - throughput_line = lines[i+1] - tp_match = throughput_pattern.search(throughput_line) - - if tp_match: - median_throughput_str = tp_match.group(3).replace('GiB/s', '').strip() - median_throughput = float(median_throughput_str) - results[data_size].append((num_pieces, median_throughput)) - - # --- Plotting Section --- - _, ax = plt.subplots(figsize=(12, 7)) - - for data_size, values in sorted(results.items()): - values.sort() - pieces = [v[0] for v in values] - throughputs = [v[1] for v in values] - ax.plot(pieces, throughputs, marker='o', linestyle='-', label=f'{data_size} data') - - # --- Formatting the Plot --- - ax.set_xscale('log', base=2) - ax.xaxis.set_major_formatter(mticker.ScalarFormatter()) - ax.set_xticks([4, 8, 16, 32, 64, 128, 256, 512]) - - ax.set_title('RLNC Encoder Median Throughput vs. Number of Pieces', fontsize=16) - ax.set_xlabel('Number of Pieces (log scale)', fontsize=12) - ax.set_ylabel('Median Throughput (GiB/s)', fontsize=12) - - ax.legend(title='Total Data Size') - ax.grid(True, which='both', linestyle='--', linewidth=0.5) - - plt.tight_layout() - - # --- Save the plot to a file instead of showing it --- - plt.savefig(output_filename, dpi=300) # dpi for higher resolution - plt.close() # Close the figure to free up memory - - print(f"Plot successfully saved to {output_filename}") - -if __name__ == '__main__': - # Run the function to generate and save the image - output_filename = sys.argv.pop() if len(sys.argv) == 2 else "rlnc_encoder_median_throughput.png" - parse_and_save_plot(benchmark_data, output_filename) diff --git a/plots/scripts/plot_recoder_bench_result.py b/plots/scripts/plot_recoder_bench_result.py deleted file mode 100644 index 56190b8..0000000 --- a/plots/scripts/plot_recoder_bench_result.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/python - -import sys -import re -import matplotlib.pyplot as plt -import matplotlib.ticker as mticker -from collections import defaultdict -import io - -# Store the recoder benchmark results in a multiline string -benchmark_data = """ -Timer precision: 15 ns -full_rlnc_recoder fastest โ”‚ slowest โ”‚ median โ”‚ mean โ”‚ samples โ”‚ iters -โ•ฐโ”€ recode โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 4 pieces, recoding with 2 pieces 26.57 ยตs โ”‚ 53.18 ยตs โ”‚ 29.96 ยตs โ”‚ 30.02 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.56 GiB/s โ”‚ 13.77 GiB/s โ”‚ 24.44 GiB/s โ”‚ 24.39 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 8 pieces, recoding with 4 pieces 19.69 ยตs โ”‚ 38.5 ยตs โ”‚ 25.16 ยตs โ”‚ 25.32 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 30.99 GiB/s โ”‚ 15.85 GiB/s โ”‚ 24.25 GiB/s โ”‚ 24.1 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 16 pieces, recoding with 8 pieces 17.68 ยตs โ”‚ 24.04 ยตs โ”‚ 20.36 ยตs โ”‚ 21.33 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 31.06 GiB/s โ”‚ 22.84 GiB/s โ”‚ 26.97 GiB/s โ”‚ 25.74 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 32 pieces, recoding with 16 pieces 18.58 ยตs โ”‚ 29.34 ยตs โ”‚ 22.68 ยตs โ”‚ 21.93 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.94 GiB/s โ”‚ 17.69 GiB/s โ”‚ 22.88 GiB/s โ”‚ 23.67 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 64 pieces, recoding with 32 pieces 18.44 ยตs โ”‚ 23.64 ยตs โ”‚ 19.41 ยตs โ”‚ 19.41 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.4 GiB/s โ”‚ 21.38 GiB/s โ”‚ 26.03 GiB/s โ”‚ 26.03 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 128 pieces, recoding with 64 pieces 26.66 ยตs โ”‚ 31.24 ยตs โ”‚ 27.85 ยตs โ”‚ 27.96 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.88 GiB/s โ”‚ 16.12 GiB/s โ”‚ 18.08 GiB/s โ”‚ 18.01 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 256 pieces, recoding with 128 pieces 54.14 ยตs โ”‚ 175.9 ยตs โ”‚ 55.88 ยตs โ”‚ 57.63 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 9.659 GiB/s โ”‚ 2.972 GiB/s โ”‚ 9.358 GiB/s โ”‚ 9.074 GiB/s โ”‚ โ”‚ - โ”œโ”€ 1.00 MB data split into 512 pieces, recoding with 256 pieces 184.3 ยตs โ”‚ 263 ยตs โ”‚ 189.9 ยตs โ”‚ 191.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 3.325 GiB/s โ”‚ 2.329 GiB/s โ”‚ 3.227 GiB/s โ”‚ 3.205 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 4 pieces, recoding with 2 pieces 91.55 ยตs โ”‚ 218.4 ยตs โ”‚ 143.9 ยตs โ”‚ 151.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 31.99 GiB/s โ”‚ 13.41 GiB/s โ”‚ 20.34 GiB/s โ”‚ 19.31 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 8 pieces, recoding with 4 pieces 87.03 ยตs โ”‚ 202.7 ยตs โ”‚ 109 ยตs โ”‚ 110.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.05 GiB/s โ”‚ 12.04 GiB/s โ”‚ 22.39 GiB/s โ”‚ 22.06 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 16 pieces, recoding with 8 pieces 74.56 ยตs โ”‚ 146.2 ยตs โ”‚ 84.93 ยตs โ”‚ 86.94 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.46 GiB/s โ”‚ 15.02 GiB/s โ”‚ 25.87 GiB/s โ”‚ 25.27 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 32 pieces, recoding with 16 pieces 68.66 ยตs โ”‚ 133 ยตs โ”‚ 75.75 ยตs โ”‚ 78.11 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 30.22 GiB/s โ”‚ 15.6 GiB/s โ”‚ 27.39 GiB/s โ”‚ 26.57 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 64 pieces, recoding with 32 pieces 70.78 ยตs โ”‚ 108.5 ยตs โ”‚ 89.05 ยตs โ”‚ 87.17 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.48 GiB/s โ”‚ 18.57 GiB/s โ”‚ 22.63 GiB/s โ”‚ 23.12 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 128 pieces, recoding with 64 pieces 76.74 ยตs โ”‚ 104.7 ยตs โ”‚ 85.82 ยตs โ”‚ 86.26 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 25.95 GiB/s โ”‚ 19.01 GiB/s โ”‚ 23.2 GiB/s โ”‚ 23.08 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 256 pieces, recoding with 128 pieces 98.12 ยตs โ”‚ 114.6 ยตs โ”‚ 101.2 ยตs โ”‚ 103.8 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 20.37 GiB/s โ”‚ 17.44 GiB/s โ”‚ 19.75 GiB/s โ”‚ 19.25 GiB/s โ”‚ โ”‚ - โ”œโ”€ 4.00 MB data split into 512 pieces, recoding with 256 pieces 230.5 ยตs โ”‚ 252.9 ยตs โ”‚ 237.1 ยตs โ”‚ 238.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 9.037 GiB/s โ”‚ 8.237 GiB/s โ”‚ 8.787 GiB/s โ”‚ 8.727 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 4 pieces, recoding with 2 pieces 313.7 ยตs โ”‚ 429.3 ยตs โ”‚ 330 ยตs โ”‚ 331.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 18.67 GiB/s โ”‚ 13.64 GiB/s โ”‚ 17.75 GiB/s โ”‚ 17.67 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 8 pieces, recoding with 4 pieces 203.9 ยตs โ”‚ 360 ยตs โ”‚ 261.6 ยตs โ”‚ 267.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 23.94 GiB/s โ”‚ 13.56 GiB/s โ”‚ 18.66 GiB/s โ”‚ 18.26 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 16 pieces, recoding with 8 pieces 158.1 ยตs โ”‚ 210.9 ยตs โ”‚ 183.1 ยตs โ”‚ 184.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 27.78 GiB/s โ”‚ 20.83 GiB/s โ”‚ 23.98 GiB/s โ”‚ 23.85 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 32 pieces, recoding with 16 pieces 141.8 ยตs โ”‚ 218.4 ยตs โ”‚ 181.7 ยตs โ”‚ 174.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 29.26 GiB/s โ”‚ 19 GiB/s โ”‚ 22.84 GiB/s โ”‚ 23.79 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 64 pieces, recoding with 32 pieces 141.1 ยตs โ”‚ 223 ยตs โ”‚ 178.4 ยตs โ”‚ 171.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 28.55 GiB/s โ”‚ 18.06 GiB/s โ”‚ 22.58 GiB/s โ”‚ 23.52 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 128 pieces, recoding with 64 pieces 149.3 ยตs โ”‚ 189.8 ยตs โ”‚ 155 ยตs โ”‚ 163.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 26.61 GiB/s โ”‚ 20.93 GiB/s โ”‚ 25.63 GiB/s โ”‚ 24.31 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 256 pieces, recoding with 128 pieces 178 ยตs โ”‚ 261.4 ยตs โ”‚ 193.9 ยตs โ”‚ 198 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.28 GiB/s โ”‚ 15.17 GiB/s โ”‚ 20.46 GiB/s โ”‚ 20.03 GiB/s โ”‚ โ”‚ - โ”œโ”€ 8.00 MB data split into 512 pieces, recoding with 256 pieces 309.5 ยตs โ”‚ 513.9 ยตs โ”‚ 323.8 ยตs โ”‚ 339.7 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 13.06 GiB/s โ”‚ 7.868 GiB/s โ”‚ 12.48 GiB/s โ”‚ 11.9 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 4 pieces, recoding with 2 pieces 837.9 ยตs โ”‚ 1.033 ms โ”‚ 932.3 ยตs โ”‚ 937.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 13.98 GiB/s โ”‚ 11.34 GiB/s โ”‚ 12.56 GiB/s โ”‚ 12.49 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 8 pieces, recoding with 4 pieces 577 ยตs โ”‚ 953.2 ยตs โ”‚ 634.5 ยตs โ”‚ 672.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 16.92 GiB/s โ”‚ 10.24 GiB/s โ”‚ 15.39 GiB/s โ”‚ 14.52 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 16 pieces, recoding with 8 pieces 441.5 ยตs โ”‚ 665 ยตs โ”‚ 511.4 ยตs โ”‚ 514.6 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 19.9 GiB/s โ”‚ 13.21 GiB/s โ”‚ 17.18 GiB/s โ”‚ 17.07 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 32 pieces, recoding with 16 pieces 414.6 ยตs โ”‚ 515.6 ยตs โ”‚ 467.1 ยตs โ”‚ 456.9 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 20.02 GiB/s โ”‚ 16.09 GiB/s โ”‚ 17.76 GiB/s โ”‚ 18.16 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 64 pieces, recoding with 32 pieces 365.1 ยตs โ”‚ 764.5 ยตs โ”‚ 435.6 ยตs โ”‚ 431.3 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 22.06 GiB/s โ”‚ 10.53 GiB/s โ”‚ 18.49 GiB/s โ”‚ 18.68 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 128 pieces, recoding with 64 pieces 369.5 ยตs โ”‚ 472.5 ยตs โ”‚ 394 ยตs โ”‚ 405.4 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 21.48 GiB/s โ”‚ 16.8 GiB/s โ”‚ 20.15 GiB/s โ”‚ 19.58 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 256 pieces, recoding with 128 pieces 389.1 ยตs โ”‚ 641.8 ยตs โ”‚ 455.7 ยตs โ”‚ 459.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 20.31 GiB/s โ”‚ 12.31 GiB/s โ”‚ 17.34 GiB/s โ”‚ 17.21 GiB/s โ”‚ โ”‚ - โ”œโ”€ 16.00 MB data split into 512 pieces, recoding with 256 pieces 527.6 ยตs โ”‚ 656.8 ยตs โ”‚ 562 ยตs โ”‚ 571.2 ยตs โ”‚ 100 โ”‚ 100 - โ”‚ 15.09 GiB/s โ”‚ 12.12 GiB/s โ”‚ 14.17 GiB/s โ”‚ 13.94 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 4 pieces, recoding with 2 pieces 1.298 ms โ”‚ 3.089 ms โ”‚ 1.882 ms โ”‚ 1.91 ms โ”‚ 100 โ”‚ 100 - โ”‚ 18.04 GiB/s โ”‚ 7.584 GiB/s โ”‚ 12.45 GiB/s โ”‚ 12.26 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 8 pieces, recoding with 4 pieces 1.175 ms โ”‚ 1.79 ms โ”‚ 1.474 ms โ”‚ 1.473 ms โ”‚ 100 โ”‚ 100 - โ”‚ 16.61 GiB/s โ”‚ 10.9 GiB/s โ”‚ 13.24 GiB/s โ”‚ 13.25 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 16 pieces, recoding with 8 pieces 1.14 ms โ”‚ 1.902 ms โ”‚ 1.275 ms โ”‚ 1.286 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.41 GiB/s โ”‚ 9.24 GiB/s โ”‚ 13.78 GiB/s โ”‚ 13.66 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 32 pieces, recoding with 16 pieces 1.109 ms โ”‚ 1.432 ms โ”‚ 1.196 ms โ”‚ 1.201 ms โ”‚ 100 โ”‚ 100 - โ”‚ 14.96 GiB/s โ”‚ 11.59 GiB/s โ”‚ 13.87 GiB/s โ”‚ 13.81 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 64 pieces, recoding with 32 pieces 1.021 ms โ”‚ 1.584 ms โ”‚ 1.098 ms โ”‚ 1.095 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.77 GiB/s โ”‚ 10.16 GiB/s โ”‚ 14.67 GiB/s โ”‚ 14.7 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 128 pieces, recoding with 64 pieces 966.9 ยตs โ”‚ 1.225 ms โ”‚ 1.019 ms โ”‚ 1.033 ms โ”‚ 100 โ”‚ 100 - โ”‚ 16.41 GiB/s โ”‚ 12.95 GiB/s โ”‚ 15.57 GiB/s โ”‚ 15.36 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 256 pieces, recoding with 128 pieces 1.001 ms โ”‚ 1.523 ms โ”‚ 1.036 ms โ”‚ 1.059 ms โ”‚ 100 โ”‚ 100 - โ”‚ 15.75 GiB/s โ”‚ 10.35 GiB/s โ”‚ 15.22 GiB/s โ”‚ 14.89 GiB/s โ”‚ โ”‚ - โ”œโ”€ 32.00 MB data split into 512 pieces, recoding with 256 pieces 1.17 ms โ”‚ 1.779 ms โ”‚ 1.38 ms โ”‚ 1.392 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.51 GiB/s โ”‚ 8.883 GiB/s โ”‚ 11.45 GiB/s โ”‚ 11.35 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 4 pieces, recoding with 2 pieces 2.351 ms โ”‚ 5.198 ms โ”‚ 4.117 ms โ”‚ 4.112 ms โ”‚ 100 โ”‚ 100 - โ”‚ 19.93 GiB/s โ”‚ 9.017 GiB/s โ”‚ 11.38 GiB/s โ”‚ 11.39 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 8 pieces, recoding with 4 pieces 3.118 ms โ”‚ 3.636 ms โ”‚ 3.17 ms โ”‚ 3.189 ms โ”‚ 100 โ”‚ 100 - โ”‚ 12.52 GiB/s โ”‚ 10.74 GiB/s โ”‚ 12.32 GiB/s โ”‚ 12.24 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 16 pieces, recoding with 8 pieces 2.528 ms โ”‚ 4.148 ms โ”‚ 3.158 ms โ”‚ 3.12 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.9 GiB/s โ”‚ 8.474 GiB/s โ”‚ 11.12 GiB/s โ”‚ 11.26 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 32 pieces, recoding with 16 pieces 2.791 ms โ”‚ 3.714 ms โ”‚ 3.007 ms โ”‚ 2.997 ms โ”‚ 100 โ”‚ 100 - โ”‚ 11.89 GiB/s โ”‚ 8.937 GiB/s โ”‚ 11.04 GiB/s โ”‚ 11.07 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 64 pieces, recoding with 32 pieces 2.613 ms โ”‚ 3.098 ms โ”‚ 2.859 ms โ”‚ 2.839 ms โ”‚ 100 โ”‚ 100 - โ”‚ 12.33 GiB/s โ”‚ 10.4 GiB/s โ”‚ 11.27 GiB/s โ”‚ 11.34 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 128 pieces, recoding with 64 pieces 2.282 ms โ”‚ 2.79 ms โ”‚ 2.545 ms โ”‚ 2.569 ms โ”‚ 100 โ”‚ 100 - โ”‚ 13.9 GiB/s โ”‚ 11.37 GiB/s โ”‚ 12.46 GiB/s โ”‚ 12.35 GiB/s โ”‚ โ”‚ - โ”œโ”€ 64.00 MB data split into 256 pieces, recoding with 128 pieces 1.92 ms โ”‚ 2.301 ms โ”‚ 1.991 ms โ”‚ 2.014 ms โ”‚ 100 โ”‚ 100 - โ”‚ 16.41 GiB/s โ”‚ 13.69 GiB/s โ”‚ 15.82 GiB/s โ”‚ 15.64 GiB/s โ”‚ โ”‚ - โ•ฐโ”€ 64.00 MB data split into 512 pieces, recoding with 256 pieces 2.052 ms โ”‚ 2.292 ms โ”‚ 2.108 ms โ”‚ 2.134 ms โ”‚ 100 โ”‚ 100 - 15.34 GiB/s โ”‚ 13.73 GiB/s โ”‚ 14.93 GiB/s โ”‚ 14.75 GiB/s โ”‚ โ”‚ -""" - -def parse_and_save_plot(data: str, output_filename: str): - """ - Parses the recoder benchmark data and saves the median throughput plot to a file. - """ - results = defaultdict(list) - - # Updated regex to match the recoder's specific output format - config_pattern = re.compile(r'([\d\.]+\s*(?:MB|GB|KB))\s+data split into\s+(\d+)\s+pieces,') - - # Regex to capture all four throughput columns remains the same - throughput_pattern = re.compile( - r'([\d\.]+\s+GiB/s)\s+โ”‚\s+' # Group 1: fastest - r'([\d\.]+\s+GiB/s)\s+โ”‚\s+' # Group 2: slowest - r'([\d\.]+\s+GiB/s)\s+โ”‚\s+' # Group 3: median - r'([\d\.]+\s+GiB/s)' # Group 4: mean - ) - - lines = io.StringIO(data).readlines() - - for i, line in enumerate(lines): - config_match = config_pattern.search(line) - if config_match: - data_size = config_match.group(1).strip() - # The x-axis is the number of pieces the data was split into - num_pieces = int(config_match.group(2)) - - if i + 1 < len(lines): - throughput_line = lines[i+1] - tp_match = throughput_pattern.search(throughput_line) - - # Check if the pattern matched and extract the median value (Group 3) - if tp_match: - median_throughput_str = tp_match.group(3).replace('GiB/s', '').strip() - median_throughput = float(median_throughput_str) - results[data_size].append((num_pieces, median_throughput)) - - # --- Plotting Section --- - fig, ax = plt.subplots(figsize=(12, 7)) - - for data_size, values in sorted(results.items()): - values.sort() - pieces = [v[0] for v in values] - throughputs = [v[1] for v in values] - ax.plot(pieces, throughputs, marker='o', linestyle='-', label=f'{data_size} data') - - # --- Formatting the Plot --- - ax.set_xscale('log', base=2) - ax.xaxis.set_major_formatter(mticker.ScalarFormatter()) - ax.set_xticks([4, 8, 16, 32, 64, 128, 256, 512]) - - # Updated title for the recoder plot - ax.set_title('RLNC Recoder Median Throughput vs. Number of Split Pieces', fontsize=16) - ax.set_xlabel('Number of Split Pieces (log scale)', fontsize=12) - ax.set_ylabel('Median Throughput (GiB/s)', fontsize=12) - - ax.legend(title='Total Data Size') - ax.grid(True, which='both', linestyle='--', linewidth=0.5) - - plt.tight_layout() - - # --- Save the plot to a file --- - plt.savefig(output_filename, dpi=300) - plt.close() - - print(f"Plot successfully saved to {output_filename}") - -if __name__ == '__main__': - # Run the function to generate and save the image - output_filename = sys.argv.pop() if len(sys.argv) == 2 else "rlnc_recoder_median_throughput.png" - parse_and_save_plot(benchmark_data, output_filename) diff --git a/plots/visualize-plot-bench-result.patch b/plots/visualize-plot-bench-result.patch deleted file mode 100644 index 721efe1..0000000 --- a/plots/visualize-plot-bench-result.patch +++ /dev/null @@ -1,648 +0,0 @@ -diff --git a/benches/full_rlnc_decoder.rs b/benches/full_rlnc_decoder.rs -index 16bcc57..e76312a 100644 ---- a/benches/full_rlnc_decoder.rs -+++ b/benches/full_rlnc_decoder.rs -@@ -5,8 +5,8 @@ use rlnc::{ - }; - use std::{fmt::Debug, time::Duration}; - --#[global_allocator] --static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); -+// #[global_allocator] -+// static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); - - fn main() { - divan::Divan::default().bytes_format(divan::counter::BytesFormat::Binary).main(); -@@ -41,6 +41,14 @@ impl Debug for RLNCConfig { - } - - const ARGS: &[RLNCConfig] = &[ -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 3, -+ }, - RLNCConfig { - data_byte_len: 1usize << 20, - piece_count: 1usize << 4, -@@ -61,6 +69,82 @@ const ARGS: &[RLNCConfig] = &[ - data_byte_len: 1usize << 20, - piece_count: 1usize << 8, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 3, -+ }, - RLNCConfig { - data_byte_len: 1usize << 24, - piece_count: 1usize << 4, -@@ -81,6 +165,18 @@ const ARGS: &[RLNCConfig] = &[ - data_byte_len: 1usize << 24, - piece_count: 1usize << 8, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 3, -+ }, - RLNCConfig { - data_byte_len: 1usize << 25, - piece_count: 1usize << 4, -@@ -101,6 +197,42 @@ const ARGS: &[RLNCConfig] = &[ - data_byte_len: 1usize << 25, - piece_count: 1usize << 8, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 9, -+ }, - ]; - - #[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -diff --git a/benches/full_rlnc_encoder.rs b/benches/full_rlnc_encoder.rs -index fb95bee..cf2bce0 100644 ---- a/benches/full_rlnc_encoder.rs -+++ b/benches/full_rlnc_encoder.rs -@@ -2,8 +2,8 @@ use rand::Rng; - use rlnc::full::Encoder; - use std::{fmt::Debug, time::Duration}; - --#[global_allocator] --static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); -+// #[global_allocator] -+// static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); - - fn main() { - divan::Divan::default().bytes_format(divan::counter::BytesFormat::Binary).main(); -@@ -38,6 +38,14 @@ impl Debug for RLNCConfig { - } - - const ARGS: &[RLNCConfig] = &[ -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 3, -+ }, - RLNCConfig { - data_byte_len: 1usize << 20, - piece_count: 1usize << 4, -@@ -58,6 +66,82 @@ const ARGS: &[RLNCConfig] = &[ - data_byte_len: 1usize << 20, - piece_count: 1usize << 8, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 3, -+ }, - RLNCConfig { - data_byte_len: 1usize << 24, - piece_count: 1usize << 4, -@@ -78,6 +162,18 @@ const ARGS: &[RLNCConfig] = &[ - data_byte_len: 1usize << 24, - piece_count: 1usize << 8, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 3, -+ }, - RLNCConfig { - data_byte_len: 1usize << 25, - piece_count: 1usize << 4, -@@ -98,6 +194,42 @@ const ARGS: &[RLNCConfig] = &[ - data_byte_len: 1usize << 25, - piece_count: 1usize << 8, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 9, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 9, -+ }, - ]; - - #[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -@@ -116,18 +248,18 @@ fn encode(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { - .bench_refs(|rng| divan::black_box(divan::black_box(&encoder).code(divan::black_box(rng)))); - } - --#[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] --fn encode_zero_alloc(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { -- let mut rng = rand::rng(); -- let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); -+// #[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -+// fn encode_zero_alloc(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { -+// let mut rng = rand::rng(); -+// let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); - -- let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); -+// let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); - -- bencher -- .counter(divan::counter::BytesCount::new( -- encoder.get_piece_byte_len() * encoder.get_piece_count() + // Number of bytes used as input to encoder -- encoder.get_full_coded_piece_byte_len(), // Number of bytes for each coded piece -- )) -- .with_inputs(|| (rand::rng(), vec![0u8; encoder.get_full_coded_piece_byte_len()])) -- .bench_refs(|(rng, coded_piece)| divan::black_box(&encoder).code_with_buf(divan::black_box(rng), divan::black_box(coded_piece))); --} -+// bencher -+// .counter(divan::counter::BytesCount::new( -+// encoder.get_piece_byte_len() * encoder.get_piece_count() + // Number of bytes used as input to encoder -+// encoder.get_full_coded_piece_byte_len(), // Number of bytes for each coded piece -+// )) -+// .with_inputs(|| (rand::rng(), vec![0u8; encoder.get_full_coded_piece_byte_len()])) -+// .bench_refs(|(rng, coded_piece)| divan::black_box(&encoder).code_with_buf(divan::black_box(rng), divan::black_box(coded_piece))); -+// } -diff --git a/benches/full_rlnc_recoder.rs b/benches/full_rlnc_recoder.rs -index 65092b1..33cf2ad 100644 ---- a/benches/full_rlnc_recoder.rs -+++ b/benches/full_rlnc_recoder.rs -@@ -2,8 +2,8 @@ use rand::Rng; - use rlnc::full::{Encoder, Recoder}; - use std::{fmt::Debug, time::Duration}; - --#[global_allocator] --static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); -+// #[global_allocator] -+// static ALLOC: divan::AllocProfiler = divan::AllocProfiler::system(); - - fn main() { - divan::Divan::default().bytes_format(divan::counter::BytesFormat::Binary).main(); -@@ -40,6 +40,16 @@ impl Debug for RLNCConfig { - } - - const ARGS: &[RLNCConfig] = &[ -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 2, -+ recoding_with_piece_count: 1usize << 1, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 3, -+ recoding_with_piece_count: 1usize << 2, -+ }, - RLNCConfig { - data_byte_len: 1usize << 20, - piece_count: 1usize << 4, -@@ -65,6 +75,101 @@ const ARGS: &[RLNCConfig] = &[ - piece_count: 1usize << 8, - recoding_with_piece_count: 1usize << 7, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 20, -+ piece_count: 1usize << 9, -+ recoding_with_piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 2, -+ recoding_with_piece_count: 1usize << 1, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 3, -+ recoding_with_piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 4, -+ recoding_with_piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 5, -+ recoding_with_piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 6, -+ recoding_with_piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 7, -+ recoding_with_piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 8, -+ recoding_with_piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 22, -+ piece_count: 1usize << 9, -+ recoding_with_piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 2, -+ recoding_with_piece_count: 1usize << 1, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 3, -+ recoding_with_piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 4, -+ recoding_with_piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 5, -+ recoding_with_piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 6, -+ recoding_with_piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 7, -+ recoding_with_piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 8, -+ recoding_with_piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 23, -+ piece_count: 1usize << 9, -+ recoding_with_piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 2, -+ recoding_with_piece_count: 1usize << 1, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 3, -+ recoding_with_piece_count: 1usize << 2, -+ }, - RLNCConfig { - data_byte_len: 1usize << 24, - piece_count: 1usize << 4, -@@ -90,6 +195,21 @@ const ARGS: &[RLNCConfig] = &[ - piece_count: 1usize << 8, - recoding_with_piece_count: 1usize << 7, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 24, -+ piece_count: 1usize << 9, -+ recoding_with_piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 2, -+ recoding_with_piece_count: 1usize << 1, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 3, -+ recoding_with_piece_count: 1usize << 2, -+ }, - RLNCConfig { - data_byte_len: 1usize << 25, - piece_count: 1usize << 4, -@@ -115,6 +235,51 @@ const ARGS: &[RLNCConfig] = &[ - piece_count: 1usize << 8, - recoding_with_piece_count: 1usize << 7, - }, -+ RLNCConfig { -+ data_byte_len: 1usize << 25, -+ piece_count: 1usize << 9, -+ recoding_with_piece_count: 1usize << 8, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 2, -+ recoding_with_piece_count: 1usize << 1, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 3, -+ recoding_with_piece_count: 1usize << 2, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 4, -+ recoding_with_piece_count: 1usize << 3, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 5, -+ recoding_with_piece_count: 1usize << 4, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 6, -+ recoding_with_piece_count: 1usize << 5, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 7, -+ recoding_with_piece_count: 1usize << 6, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 8, -+ recoding_with_piece_count: 1usize << 7, -+ }, -+ RLNCConfig { -+ data_byte_len: 1usize << 26, -+ piece_count: 1usize << 9, -+ recoding_with_piece_count: 1usize << 8, -+ }, - ]; - - #[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -@@ -143,31 +308,31 @@ fn recode(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { - .bench_refs(|(rng, recoder)| divan::black_box(divan::black_box(recoder).recode(divan::black_box(rng)))); - } - --#[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] --fn recode_zero_alloc(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { -- let mut rng = rand::rng(); -- let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); -+// #[divan::bench(args = ARGS, max_time = Duration::from_secs(100), skip_ext_time = true)] -+// fn recode_zero_alloc(bencher: divan::Bencher, rlnc_config: &RLNCConfig) { -+// let mut rng = rand::rng(); -+// let data = (0..rlnc_config.data_byte_len).map(|_| rng.random()).collect::>(); - -- let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); -- let coded_pieces = (0..rlnc_config.recoding_with_piece_count) -- .flat_map(|_| encoder.code(&mut rng)) -- .collect::>(); -+// let encoder = Encoder::new(data, rlnc_config.piece_count).expect("Failed to create RLNC encoder"); -+// let coded_pieces = (0..rlnc_config.recoding_with_piece_count) -+// .flat_map(|_| encoder.code(&mut rng)) -+// .collect::>(); - -- bencher -- .with_inputs(|| { -- ( -- rand::rng(), -- Recoder::new(coded_pieces.clone(), encoder.get_full_coded_piece_byte_len(), encoder.get_piece_count()).expect("Failed to create RLNC recoder"), -- vec![0u8; encoder.get_full_coded_piece_byte_len()], -- ) -- }) -- .input_counter(|(_, recoder, _)| { -- divan::counter::BytesCount::new( -- recoder.get_full_coded_piece_byte_len() * recoder.get_num_pieces_recoded_together() + // Number of bytes used as input to recoder -- recoder.get_full_coded_piece_byte_len(), // Number of bytes for each recoded piece -- ) -- }) -- .bench_refs(|(rng, recoder, recoded_piece)| { -- divan::black_box(divan::black_box(recoder).recode_with_buf(divan::black_box(rng), divan::black_box(recoded_piece))) -- }); --} -+// bencher -+// .with_inputs(|| { -+// ( -+// rand::rng(), -+// Recoder::new(coded_pieces.clone(), encoder.get_full_coded_piece_byte_len(), encoder.get_piece_count()).expect("Failed to create RLNC recoder"), -+// vec![0u8; encoder.get_full_coded_piece_byte_len()], -+// ) -+// }) -+// .input_counter(|(_, recoder, _)| { -+// divan::counter::BytesCount::new( -+// recoder.get_full_coded_piece_byte_len() * recoder.get_num_pieces_recoded_together() + // Number of bytes used as input to recoder -+// recoder.get_full_coded_piece_byte_len(), // Number of bytes for each recoded piece -+// ) -+// }) -+// .bench_refs(|(rng, recoder, recoded_piece)| { -+// divan::black_box(divan::black_box(recoder).recode_with_buf(divan::black_box(rng), divan::black_box(recoded_piece))) -+// }); -+// } diff --git a/src/lib.rs b/src/lib.rs index 06d653e..366656a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -115,9 +115,9 @@ //! //! ```toml //! [dependencies] -//! rlnc = "=0.8.5" # On x86_64 and aarch64 targets, it offers fast encoding, recoding and decoding, using SIMD intrinsics. +//! rlnc = "=0.8.6" # On x86_64 and aarch64 targets, it offers fast encoding, recoding and decoding, using SIMD intrinsics. //! # or -//! rlnc = { version = "=0.8.5", features = "parallel" } # Uses `rayon`-based data-parallelism for fast encoding/ recoding. Decoding is not yet parallelized. +//! rlnc = { version = "=0.8.6", features = "parallel" } # Uses `rayon`-based data-parallelism for fast encoding/ recoding. Decoding is not yet parallelized. //! //! rand = { version = "=0.9.1" } # Required for random number generation //! ```