# Benchmarks Benchmarks are via Criterion. As can be seen, `Trc`'s performance really shines when there are many Clones. The reason `Trc` does not do as well for fewer operations is that it needs to allocate `n+1` blocks of memory for `n` threads, and so for 1 thread, there are 2 allocations. However, after the initial allocations, `Trc` performs very well - 3.81x `Arc`'s time for Clones. ### Clone | Type | Mean time | | --- | ----------- | | Trc | 26.913ns | | Arc | 33.803ns | | Rc | 11.228ns | ### Multiple Clone (100 times) | Type | Mean time | | --- | ----------- | | Trc | 423.020ns | | Arc | 1273.200ns | | Rc | 352.920ns | ### Deref | Type | Mean time | | --- | ----------- | | Trc | 20.802ns | | Arc | 20.802ns | | Rc | 9.264ns | ### Multiple Deref (100 times) | Type | Mean time | | --- | ----------- | | Trc | 35.577ns | | Arc | 35.853ns | | Rc | 29.454ns | ### Multiple Threads Drop and Clone (1000 times) | Type | Mean time | | --- | ----------- | | Trc | 2.80ms | | Arc | 4.02ms | 1.44x faster - because of the allocation cost of `SharedTrc`. ### Multiple Threads Drop and Clone (5000 times) | Type | Mean time | | --- | ----------- | | Trc | 3.480ms | | Arc | 9.415ms | 2.71x faster - the allocation cost of `SharedTrc` begins to become replaced by the `Clone` efficiency. ### Multiple Threads Drop and Clone (100000 times) | Type | Mean time | | --- | ----------- | | Trc | 18.451ms | | Arc | 137.980ms | 7.44x faster - the allocation cost of `SharedTrc` is now negligible and the `Clone` advantage is beginning to be demonstrated. ### Multiple Threads Drop and Clone (500000 times) | Type | Mean time | | --- | ----------- | | Trc | 71.490ms | | Arc | 638.180ms | 8.92x faster - the allocation cost of `SharedTrc` is now negligible and the `Clone` advantage is demonstrated. Test platforms: - WSL2 5.15.90 + Intel Xeon E3-1535M (x86_64) - Ubuntu 20.04 + Intel Xeon Platinum 8358 (x86_64) - Debian 6.1.20 + ARM Neoverse-N1 (aarch64) - MacOS 13.4.1 + Apple M1 Max (aarch64) ## WSL2 (Ubuntu 22.04) 5.15.90 + Intel Xeon E3-1535M (x86_64) ```shell curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" git clone https://github.com/EricLBuehler/trc.git cd trc # Benchmarks cargo install cargo-criterion cargo criterion # Tests rustup +nightly component add miri cargo +nightly miri test MIRIFLAGS="-Zmiri-strict-provenance" cargo +nightly miri test MIRIFLAGS="-Zmiri-symbolic-alignment-check" cargo +nightly miri test MIRIFLAGS="-Zmiri-tree-borrows" cargo +nightly miri test ``` **All tests passed.** ### Clone | Type | Mean time | | --- | ----------- | | Trc | 36.201ns | | Arc | 43.793ns | | Rc | 14.112ns | ### Multiple Clone (100 times) | Type | Mean time | | --- | ----------- | | Trc | 350.000ns | | Arc | 1331.900ns | | Rc | 303.73ns | ### Deref | Type | Mean time | | --- | ----------- | | Trc | 26.978ns | | Arc | 24.745ns | | Rc | 12.249ns | ### Multiple Deref (100 times) | Type | Mean time | | --- | ----------- | | Trc | 55.148ns | | Arc | 54.261ns | | Rc | 44.764ns | ### Multiple Threads Drop and Clone (1000 times) | Type | Mean time | | --- | ----------- | | Trc | 10.945ms | | Arc | 13.754ms | ### Multiple Threads Drop and Clone (5000 times) | Type | Mean time | | --- | ----------- | | Trc | 12.300ms | | Arc | 18.104ms | ### Multiple Threads Drop and Clone (100000 times) | Type | Mean time | | --- | ----------- | | Trc | 30.666ms | | Arc | 126.330ms | ### Multiple Threads Drop and Clone (500000 times) | Type | Mean time | | --- | ----------- | | Trc | 88.387ms | | Arc | 534.67ms | ![Trc vs Arc performance (WSL2 x86_64)](./figures/wsl2_x86_64.png) ## Ubuntu 20.04 + Intel Xeon Platinum 8358 (x86_64) ```shell sudo apt update curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" git clone https://github.com/EricLBuehler/trc.git cd trc # Benchmarks cargo install cargo-criterion cargo criterion # Tests rustup +nightly component add miri cargo +nightly miri test MIRIFLAGS="-Zmiri-strict-provenance" cargo +nightly miri test MIRIFLAGS="-Zmiri-symbolic-alignment-check" cargo +nightly miri test MIRIFLAGS="-Zmiri-tree-borrows" cargo +nightly miri test ``` **All tests passed.** ### Clone | Type | Mean time | | --- | ----------- | | Trc | 26.913ns | | Arc | 33.803ns | | Rc | 11.228ns | ### Multiple Clone (100 times) | Type | Mean time | | --- | ----------- | | Trc | 423.020ns | | Arc | 1273.200ns | | Rc | 352.920ns | ### Deref | Type | Mean time | | --- | ----------- | | Trc | 20.802ns | | Arc | 20.802ns | | Rc | 9.264ns | ### Multiple Deref (100 times) | Type | Mean time | | --- | ----------- | | Trc | 35.577ns | | Arc | 35.853ns | | Rc | 29.454ns | ### Multiple Threads Drop and Clone (1000 times) | Type | Mean time | | --- | ----------- | | Trc | 2.80ms | | Arc | 4.02ms | ### Multiple Threads Drop and Clone (5000 times) | Type | Mean time | | --- | ----------- | | Trc | 3.480ms | | Arc | 9.415ms | ### Multiple Threads Drop and Clone (100000 times) | Type | Mean time | | --- | ----------- | | Trc | 18.451ms | | Arc | 137.980ms | ### Multiple Threads Drop and Clone (500000 times) | Type | Mean time | | --- | ----------- | | Trc | 71.490ms | | Arc | 638.180ms | ![Trc vs Arc performance (Ubuntu x86_64)](./figures/ubuntu_x86_64.png) ## Debian 6.1.20 + ARM Neoverse-N1 (aarch64) ```shell curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" git clone https://github.com/EricLBuehler/trc.git cd trc sudo apt install git sudo apt install build-essential # Benchmarks cargo install cargo-criterion cargo criterion # Tests rustup +nightly component add miri cargo +nightly miri test MIRIFLAGS="-Zmiri-strict-provenance" cargo +nightly miri test MIRIFLAGS="-Zmiri-symbolic-alignment-check" cargo +nightly miri test MIRIFLAGS="-Zmiri-tree-borrows" cargo +nightly miri test ``` **All tests passed.** ### Clone | Type | Mean time | | --- | ----------- | | Trc | 45.005ns | | Arc | 42.873ns | | Rc | 16.684ns | ### Multiple Clone (100 times) | Type | Mean time | | --- | ----------- | | Trc | 422.680ns | | Arc | 1208.100ns | | Rc | 353.41ns | ### Deref | Type | Mean time | | --- | ----------- | | Trc | 28.721ns | | Arc | 32.815ns | | Rc | 14.134ns | ### Multiple Deref (100 times) | Type | Mean time | | --- | ----------- | | Trc | 62.983ns | | Arc | 61.937ns | | Rc | 48.643ns | ### Multiple Threads Drop and Clone (1000 times) | Type | Mean time | | --- | ----------- | | Trc | 1.883ms | | Arc | 2.913ms | ### Multiple Threads Drop and Clone (5000 times) | Type | Mean time | | --- | ----------- | | Trc | 2.424ms | | Arc | 7.672ms | ### Multiple Threads Drop and Clone (100000 times) | Type | Mean time | | --- | ----------- | | Trc | 16.535ms | | Arc | 119.950ms | ### Multiple Threads Drop and Clone (500000 times) | Type | Mean time | | --- | ----------- | | Trc | 71.543ms | | Arc | 590.530ms | ![Trc vs Arc performance (Debian aarch64)](./figures/debian_aarch64.png) ## MacOS 13.4.1 + Apple M1 Max (aarch64) ```shell curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" git clone https://github.com/EricLBuehler/trc.git cd trc sudo apt install git sudo apt install build-essential # Benchmarks cargo install cargo-criterion cargo criterion # Tests rustup +nightly component add miri cargo +nightly miri test MIRIFLAGS="-Zmiri-strict-provenance" cargo +nightly miri test MIRIFLAGS="-Zmiri-symbolic-alignment-check" cargo +nightly miri test MIRIFLAGS="-Zmiri-tree-borrows" cargo +nightly miri test ``` **All tests passed.** ### Clone | Type | Mean time | | --- | ----------- | | Trc | 29.750ns | | Arc | 20.221ns | | Rc | 16.191ns | ### Multiple Clone (100 times) | Type | Mean time | | --- | ----------- | | Trc | 440.81ns | | Arc | 969.18ns | | Rc | 409.55ns | ### Deref | Type | Mean time | | --- | ----------- | | Trc | 16.279ns | | Arc | 16.620ns | | Rc | 15.590ns | ### Multiple Deref (100 times) | Type | Mean time | | --- | ----------- | | Trc | 49.710ns | | Arc | 49.918ns | | Rc | 46.284ns | ### Multiple Threads Drop and Clone (1000 times) | Type | Mean time | | --- |-----------| | Trc | 1.688ms | | Arc | 2.668ms | ### Multiple Threads Drop and Clone (5000 times) | Type | Mean time | | --- |-----------| | Trc | 1.968ms | | Arc | 6.488ms | ### Multiple Threads Drop and Clone (100000 times) | Type | Mean time | | --- | ---------- | | Trc | 8.095ms | | Arc | 97.976ms | ### Multiple Threads Drop and Clone (500000 times) | Type | Mean time | | --- |----------| | Trc | 34.526ms | | Arc | 477.230ms | ![Trc vs Arc performance (apple darwin aarch64)](./figures/apple_darwin_aarch64.png)