rlnc
Random Linear Network Coding
Introduction
rlnc
is a Rust library crate that implements Random Linear Network Coding (RLNC) over $GF(28)$ with primitive polynomial $x8 + x4 + x3 + x^2 + 1$. This library provides functionalities for erasure-coding 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.
For a quick understanding of RLNC, have a look at my blog post @ https://itzmeanjan.in/pages/rlnc-in-depth.html.
Random Linear Network Coding (RLNC) excels in highly dynamic and lossy environments like multicast, peer-to-peer networks, and distributed storage, due to interesting properties such as encoding with random-sampled coefficients, any k
out of n
coded-pieces are sufficient to recover and recoding new pieces with existing erasure-coded pieces. Unlike Reed-Solomon, which requires specific symbols for deterministic recovery, RLNC allows decoding from any set of linearly independent packets. Compared to Fountain Codes, RLNC offers robust algebraic linearity with coding vector overhead, whereas Fountain codes prioritize very low decoding complexity and indefinite symbol generation, often for large-scale broadcasts.
Features
For now this crate implements only Full RLNC scheme.
- Encoder: Splits original data into fixed-size pieces and generates new coded pieces by linearly combining these original pieces with random coefficients, sampled from $GF(2^8)$.
- Decoder: Receives coded pieces, applies Gaussian elimination to recover the original data, and handles linearly dependent pieces gracefully.
- Recoder: Takes already coded pieces and generates new coded pieces from them, facilitating multi-hop data distribution without requiring intermediate decoding.
- Error Handling: Defines a custom
RLNCError
enum to provide clear error messages for various operational failures.
Prerequisites
Rust stable toolchain; see https://rustup.rs for installation guide. MSRV for this crate is 1.85.0.
# While developing this library, I was using
$ rustc --version
rustc 1.88.0 (6b00bc388 2025-06-23)
Testing
For ensuring functional correctness of RLNC operations, the library includes a comprehensive test suite. Run all the tests by running following commands.
# Testing on host, first with `default` feature, then with `parallel` feature enabled.
make test
# Testing on web assembly target, using `wasmtime`.
rustup target add wasm32-wasip1
rustup target add wasm32-wasip2
cargo install wasmtime-cli@35.0.0 --locked
make test-wasm
running 14 tests
test full::decoder::tests::test_decoder_decode_invalid_piece_length ... ok
test full::decoder::tests::test_decoder_new_invalid_inputs ... ok
test full::encoder::tests::test_encoder_code_with_coding_vector_invalid_inputs ... ok
test full::decoder::tests::test_decoder_getters ... ok
test full::encoder::tests::test_encoder_getters ... ok
test full::encoder::tests::test_encoder_without_padding_invalid_data ... ok
test full::encoder::tests::test_encoder_new_invalid_inputs ... ok
test full::recoder::tests::test_recoder_getters ... ok
test full::recoder::tests::test_recoder_new_invalid_inputs ... ok
test common::gf256::test::prop_test_gf256_operations ... ok
test full::tests::prop_test_rlnc_encoder_decoder ... ok
test full::decoder_matrix::test::prop_test_rref_is_idempotent ... ok
test full::tests::prop_test_rlnc_encoder_recoder_decoder ... ok
test full::tests::prop_test_rlnc_decoding_with_useless_pieces has been running for over 60 seconds
test full::tests::prop_test_rlnc_decoding_with_useless_pieces ... ok
test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 63.59s
Doc-tests rlnc
running 3 tests
test src/common/simd_mul_table.rs - common::simd_mul_table (line 22) ... ignored
test src/common/simd_mul_table.rs - common::simd_mul_table (line 8) ... ignored
test src/lib.rs - (line 49) ... ok
test result: ok. 1 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s
Code Coverage
To generate a detailed code coverage report in HTML format, use cargo-tarpaulin:
# Install cargo-tarpaulin if not already installed
cargo install cargo-tarpaulin
make coverage
Coverage Results:
|| Tested/Total Lines:
|| src/common/errors.rs: 0/1
|| src/common/gf256.rs: 9/11
|| src/common/simd/mod.rs: 6/9
|| src/common/simd/x86/avx2.rs: 10/10
|| src/common/simd/x86/mod.rs: 6/15
|| src/common/simd/x86/ssse3.rs: 0/10
|| src/full/decoder.rs: 25/32
|| src/full/decoder_matrix.rs: 51/58
|| src/full/encoder.rs: 24/27
|| src/full/recoder.rs: 28/36
||
76.08% coverage, 159/209 lines covered
This will create an HTML coverage report at tarpaulin-report.html
that you can open in your web browser to view detailed line-by-line coverage information for all source files.
[!NOTE] There is a help menu, which introduces you to all available commands; just run
$ make
from the root directory of this project.
Benchmarking
Performance benchmarks for several input configurations are included to evaluate the efficiency of this RLNC implementation.
To run the benchmarks, execute the following command from the root of the project:
make bench # First with `default` feature, then with `parallel` feature enabled.
[!WARNING] When benchmarking make sure you've disabled CPU frequency scaling, otherwise numbers you see can be misleading. I find https://github.com/google/benchmark/blob/b40db869/docs/reducing_variance.md helpful.
On 12th Gen Intel(R) Core(TM) i7-1260P
Running benchmarks on Linux 6.14.0-27-generic x86_64
, compiled with rustc 1.88.0 (6b00bc388 2025-06-23)
.
Component | Peak Median Throughput (default feature) |
Peak Median Throughput (parallel feature) |
Impact of number of pieces on performance |
---|---|---|---|
Full RLNC Encoder | 30.14 GiB/s | 23.39 GiB/s | The number of pieces original data got split into has a minimal impact on the encoding speed. |
Full RLNC Recoder | 27.26 GiB/s | 12.63 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.59 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.
Full RLNC Encoder
# 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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
# 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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
# 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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.
Full RLNC Encoder
# 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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
# 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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
# 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 splitted 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 │ │
Performance Comparison (x86 vs aarch64)
Here's a side-by-side comparison of the peak median throughput between the x86 (12th Gen Intel(R) Core(TM) i7-1260P
) and aarch64 (AWS EC2 m8g.large
with Graviton4 CPU) targets.
Component | x86 (default ) |
aarch64 (default ) |
x86 (parallel ) |
aarch64 (parallel ) |
---|---|---|---|---|
Full RLNC Encoder | 30.14 GiB/s | 19.73 GiB/s | 23.39 GiB/s | 12.95 GiB/s |
Full RLNC Recoder | 27.26 GiB/s | 19.2 GiB/s | 12.63 GiB/s | 10.43 GiB/s |
Full RLNC Decoder | 1.59 GiB/s | 0.84 GiB/s | N/A | N/A |
The x86
architecture, particularly with AVX2 optimizations, generally outperforms the aarch64
architecture with NEON optimizations in both encoding and recoding operations. Decoding, which is a serial operation for now, is significantly faster on the x86
processor.
Usage
To use rlnc
library crate in your Rust project, add it as a dependency in your Cargo.toml
:
[dependencies]
rlnc = "=0.8.2" # On x86 and aarch64 targets, it offers fast encoding, recoding and decoding, using SIMD intrinsics.
# or
rlnc = { version = "=0.8.2", 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.1" } # Required for random number generation
Full RLNC Workflow Example
I maintain an example demonstrating the Full RLNC workflow:
- Encoding original data into coded pieces.
- Recoding to generate new pieces from received coded pieces. It simulates a relay node.
- Finally decoding all received pieces to recover the original data.
[!NOTE] New recoded pieces could be either useful or not for the Decoder, based on Recoder input coded pieces i.e. from which they are recoded and whether they have already been seen by Decoder or not.
See full_rlnc.rs example program. Run the program with $ make example
.
Initialized Encoder with 10240 bytes of data, split into 32 pieces, each of 321 bytes. Each coded piece will be of 353 bytes.
Initializing Decoder, expecting 32 original pieces of 321 bytes each.
Sender generating 16 initial coded pieces...
Decoded direct piece 1: Useful.
Decoded direct piece 2: Useful.
Decoded direct piece 3: Useful.
Decoded direct piece 4: Useful.
Decoded direct piece 5: Useful.
Decoded direct piece 6: Useful.
Decoded direct piece 7: Useful.
Decoded direct piece 8: Useful.
Decoded direct piece 9: Useful.
Decoded direct piece 10: Useful.
Decoded direct piece 11: Useful.
Decoded direct piece 12: Useful.
Decoded direct piece 13: Useful.
Decoded direct piece 14: Useful.
Decoded direct piece 15: Useful.
Decoded direct piece 16: Useful.
Initializing Recoder with 5648 bytes of received coded pieces.
Recoder active. Generating recoded pieces...
Decoded recoded piece 1: Not useful.
Decoded recoded piece 2: Not useful.
Decoded recoded piece 3: Not useful.
Decoded recoded piece 4: Not useful.
Decoded recoded piece 5: Not useful.
Decoded recoded piece 6: Not useful.
Decoded recoded piece 7: Not useful.
Decoded recoded piece 8: Not useful.
Decoded recoded piece 9: Not useful.
Decoded recoded piece 10: Not useful.
Decoded recoded piece 11: Not useful.
Decoded recoded piece 12: Not useful.
Decoded recoded piece 13: Not useful.
Decoded recoded piece 14: Not useful.
Decoded recoded piece 15: Not useful.
Decoded recoded piece 16: Not useful.
Decoded recoded piece 17: Not useful.
Decoded recoded piece 18: Not useful.
Decoded recoded piece 19: Not useful.
Decoded recoded piece 20: Not useful.
Decoded recoded piece 21: Not useful.
Decoded recoded piece 22: Not useful.
Decoded recoded piece 23: Not useful.
Decoded recoded piece 24: Not useful.
Decoded recoded piece 25: Not useful.
Decoded recoded piece 26: Not useful.
Decoded recoded piece 27: Not useful.
Decoded recoded piece 28: Not useful.
Decoded recoded piece 29: Not useful.
Decoded recoded piece 30: Not useful.
Decoded recoded piece 31: Not useful.
Decoded recoded piece 32: Not useful.
Decoded recoded piece 33: Not useful.
Decoded recoded piece 34: Not useful.
Decoded recoded piece 35: Not useful.
Decoded recoded piece 36: Not useful.
Decoded recoded piece 37: Not useful.
Decoded recoded piece 38: Not useful.
Decoded recoded piece 39: Not useful.
Decoded recoded piece 40: Not useful.
Decoded recoded piece 41: Not useful.
Decoded recoded piece 42: Not useful.
Decoded recoded piece 43: Not useful.
Decoded recoded piece 44: Not useful.
Decoded recoded piece 45: Not useful.
Decoded recoded piece 46: Not useful.
Decoded recoded piece 47: Not useful.
Decoded recoded piece 48: Not useful.
Decoded recoded piece 49: Not useful.
Decoded recoded piece 50: Not useful.
Decoded recoded piece 51: Not useful.
Decoded recoded piece 52: Not useful.
Decoded recoded piece 53: Not useful.
Decoded recoded piece 54: Not useful.
Decoded recoded piece 55: Not useful.
Decoded recoded piece 56: Not useful.
Decoded recoded piece 57: Not useful.
Decoded recoded piece 58: Not useful.
Decoded recoded piece 59: Not useful.
Decoded recoded piece 60: Not useful.
Decoded recoded piece 61: Not useful.
Decoded recoded piece 62: Not useful.
Decoded recoded piece 63: Not useful.
Decoded recoded piece 64: Not useful.
Initializing a new Recoder with 5648 bytes of received coded pieces.
Decoded recoded piece 1: Useful.
Decoded recoded piece 2: Useful.
Decoded recoded piece 3: Useful.
Decoded recoded piece 4: Useful.
Decoded recoded piece 5: Useful.
Decoded recoded piece 6: Useful.
Decoded recoded piece 7: Useful.
Decoded recoded piece 8: Useful.
Still need more pieces. Generating direct piece 17 from encoder...
Decoded direct piece 17: Useful.
Still need more pieces. Generating direct piece 18 from encoder...
Decoded direct piece 18: Useful.
Still need more pieces. Generating direct piece 19 from encoder...
Decoded direct piece 19: Useful.
Still need more pieces. Generating direct piece 20 from encoder...
Decoded direct piece 20: Useful.
Still need more pieces. Generating direct piece 21 from encoder...
Decoded direct piece 21: Useful.
Still need more pieces. Generating direct piece 22 from encoder...
Decoded direct piece 22: Useful.
Still need more pieces. Generating direct piece 23 from encoder...
Decoded direct piece 23: Useful.
Still need more pieces. Generating direct piece 24 from encoder...
Decoded direct piece 24: Useful.
Retrieving decoded data...
RLNC workflow completed successfully! Original data matches decoded data.