Skip to content

Commit

Permalink
chore: update benchmarks, add up to 1MiB
Browse files Browse the repository at this point in the history
  • Loading branch information
DaniPopes committed Feb 24, 2024
1 parent 0d0986e commit 5c7478f
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 83 deletions.
164 changes: 89 additions & 75 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,87 +27,101 @@ This crate is 10 to 50 times faster than [`hex`] in encoding and decoding, and
100+ times faster than `libstd` in formatting.

The following benchmarks were ran on an AMD Ryzen 9 7950X, compiled with
`1.78.0-nightly (2bf78d12d 2024-02-18)` on `x86_64-unknown-linux-gnu`.
`1.78.0-nightly (a4472498d 2024-02-15)` on `x86_64-unknown-linux-gnu`.

You can run these benchmarks with
`./benches/bench/gen-data.py && cargo bench --features std` on a nightly
compiler.

```log
test decode::const_hex::bench1_32 ... bench: 14 ns/iter (+/- 0)
test decode::const_hex::bench2_256 ... bench: 36 ns/iter (+/- 0)
test decode::const_hex::bench3_2048 ... bench: 223 ns/iter (+/- 3)
test decode::const_hex::bench4_16384 ... bench: 1,607 ns/iter (+/- 26)
test decode::const_hex::bench5_262144 ... bench: 25,604 ns/iter (+/- 487)
test decode::faster_hex::bench1_32 ... bench: 15 ns/iter (+/- 0)
test decode::faster_hex::bench2_256 ... bench: 49 ns/iter (+/- 0)
test decode::faster_hex::bench3_2048 ... bench: 241 ns/iter (+/- 2)
test decode::faster_hex::bench4_16384 ... bench: 1,753 ns/iter (+/- 28)
test decode::faster_hex::bench5_262144 ... bench: 27,650 ns/iter (+/- 481)
test decode::hex::bench1_32 ... bench: 94 ns/iter (+/- 5)
test decode::hex::bench2_256 ... bench: 690 ns/iter (+/- 13)
test decode::hex::bench3_2048 ... bench: 5,282 ns/iter (+/- 322)
test decode::hex::bench4_16384 ... bench: 41,557 ns/iter (+/- 2,409)
test decode::hex::bench5_262144 ... bench: 1,491,536 ns/iter (+/- 26,706)
test decode_to_slice::const_hex::bench1_32 ... bench: 5 ns/iter (+/- 0)
test decode_to_slice::const_hex::bench2_256 ... bench: 26 ns/iter (+/- 0)
test decode_to_slice::const_hex::bench3_2048 ... bench: 199 ns/iter (+/- 3)
test decode_to_slice::const_hex::bench4_16384 ... bench: 1,589 ns/iter (+/- 14)
test decode_to_slice::const_hex::bench5_262144 ... bench: 25,425 ns/iter (+/- 560)
test decode_to_slice::faster_hex::bench1_32 ... bench: 5 ns/iter (+/- 0)
test decode_to_slice::faster_hex::bench2_256 ... bench: 28 ns/iter (+/- 0)
test decode_to_slice::faster_hex::bench3_2048 ... bench: 205 ns/iter (+/- 3)
test decode_to_slice::faster_hex::bench4_16384 ... bench: 1,633 ns/iter (+/- 23)
test decode_to_slice::faster_hex::bench5_262144 ... bench: 25,873 ns/iter (+/- 1,158)
test decode_to_slice::hex::bench1_32 ... bench: 35 ns/iter (+/- 1)
test decode_to_slice::hex::bench2_256 ... bench: 297 ns/iter (+/- 12)
test decode_to_slice::hex::bench3_2048 ... bench: 2,538 ns/iter (+/- 178)
test decode_to_slice::hex::bench4_16384 ... bench: 20,496 ns/iter (+/- 1,198)
test decode_to_slice::hex::bench5_262144 ... bench: 1,215,996 ns/iter (+/- 12,647)
test encode::const_hex::bench1_32 ... bench: 9 ns/iter (+/- 0)
test encode::const_hex::bench2_256 ... bench: 29 ns/iter (+/- 0)
test encode::const_hex::bench3_2048 ... bench: 96 ns/iter (+/- 2)
test encode::const_hex::bench4_16384 ... bench: 641 ns/iter (+/- 8)
test encode::const_hex::bench5_262144 ... bench: 10,217 ns/iter (+/- 403)
test encode::faster_hex::bench1_32 ... bench: 16 ns/iter (+/- 0)
test encode::faster_hex::bench2_256 ... bench: 37 ns/iter (+/- 0)
test encode::faster_hex::bench3_2048 ... bench: 101 ns/iter (+/- 2)
test encode::faster_hex::bench4_16384 ... bench: 633 ns/iter (+/- 9)
test encode::faster_hex::bench5_262144 ... bench: 10,340 ns/iter (+/- 541)
test encode::hex::bench1_32 ... bench: 95 ns/iter (+/- 7)
test encode::hex::bench2_256 ... bench: 685 ns/iter (+/- 98)
test encode::hex::bench3_2048 ... bench: 5,416 ns/iter (+/- 254)
test encode::hex::bench4_16384 ... bench: 43,155 ns/iter (+/- 1,980)
test encode::hex::bench5_262144 ... bench: 702,371 ns/iter (+/- 73,299)
test encode_to_slice::const_hex::bench1_32 ... bench: 1 ns/iter (+/- 0)
test encode_to_slice::const_hex::bench2_256 ... bench: 6 ns/iter (+/- 0)
test encode_to_slice::const_hex::bench3_2048 ... bench: 51 ns/iter (+/- 0)
test encode_to_slice::const_hex::bench4_16384 ... bench: 443 ns/iter (+/- 20)
test encode_to_slice::const_hex::bench5_262144 ... bench: 7,009 ns/iter (+/- 269)
test encode_to_slice::faster_hex::bench1_32 ... bench: 4 ns/iter (+/- 0)
test encode_to_slice::faster_hex::bench2_256 ... bench: 7 ns/iter (+/- 0)
test encode_to_slice::faster_hex::bench3_2048 ... bench: 46 ns/iter (+/- 0)
test encode_to_slice::faster_hex::bench4_16384 ... bench: 407 ns/iter (+/- 13)
test encode_to_slice::faster_hex::bench5_262144 ... bench: 6,196 ns/iter (+/- 167)
test encode_to_slice::hex::bench1_32 ... bench: 11 ns/iter (+/- 0)
test encode_to_slice::hex::bench2_256 ... bench: 114 ns/iter (+/- 0)
test encode_to_slice::hex::bench3_2048 ... bench: 955 ns/iter (+/- 10)
test encode_to_slice::hex::bench4_16384 ... bench: 7,721 ns/iter (+/- 70)
test encode_to_slice::hex::bench5_262144 ... bench: 122,247 ns/iter (+/- 3,388)
test format::const_hex::bench1_32 ... bench: 9 ns/iter (+/- 0)
test format::const_hex::bench2_256 ... bench: 23 ns/iter (+/- 2)
test format::const_hex::bench3_2048 ... bench: 118 ns/iter (+/- 3)
test format::const_hex::bench4_16384 ... bench: 1,133 ns/iter (+/- 15)
test format::const_hex::bench5_262144 ... bench: 19,991 ns/iter (+/- 1,012)
test format::std::bench1_32 ... bench: 338 ns/iter (+/- 4)
test format::std::bench2_256 ... bench: 2,700 ns/iter (+/- 55)
test format::std::bench3_2048 ... bench: 21,852 ns/iter (+/- 278)
test format::std::bench4_16384 ... bench: 178,010 ns/iter (+/- 1,697)
test format::std::bench5_262144 ... bench: 2,865,767 ns/iter (+/- 62,347)
test decode::const_hex::bench1_32b ... bench: 14 ns/iter (+/- 0)
test decode::const_hex::bench2_256b ... bench: 37 ns/iter (+/- 4)
test decode::const_hex::bench3_2k ... bench: 226 ns/iter (+/- 7)
test decode::const_hex::bench4_16k ... bench: 1,636 ns/iter (+/- 13)
test decode::const_hex::bench5_128k ... bench: 12,644 ns/iter (+/- 84)
test decode::const_hex::bench6_1m ... bench: 102,836 ns/iter (+/- 3,236)
test decode::faster_hex::bench1_32b ... bench: 15 ns/iter (+/- 0)
test decode::faster_hex::bench2_256b ... bench: 50 ns/iter (+/- 1)
test decode::faster_hex::bench3_2k ... bench: 244 ns/iter (+/- 4)
test decode::faster_hex::bench4_16k ... bench: 1,782 ns/iter (+/- 31)
test decode::faster_hex::bench5_128k ... bench: 13,745 ns/iter (+/- 66)
test decode::faster_hex::bench6_1m ... bench: 115,126 ns/iter (+/- 1,544)
test decode::hex::bench1_32b ... bench: 101 ns/iter (+/- 6)
test decode::hex::bench2_256b ... bench: 701 ns/iter (+/- 12)
test decode::hex::bench3_2k ... bench: 5,287 ns/iter (+/- 97)
test decode::hex::bench4_16k ... bench: 41,743 ns/iter (+/- 1,420)
test decode::hex::bench5_128k ... bench: 782,327 ns/iter (+/- 18,876)
test decode::hex::bench6_1m ... bench: 6,283,181 ns/iter (+/- 88,813)
test decode_to_slice::const_hex::bench1_32b ... bench: 5 ns/iter (+/- 0)
test decode_to_slice::const_hex::bench2_256b ... bench: 25 ns/iter (+/- 0)
test decode_to_slice::const_hex::bench3_2k ... bench: 201 ns/iter (+/- 3)
test decode_to_slice::const_hex::bench4_16k ... bench: 1,600 ns/iter (+/- 17)
test decode_to_slice::const_hex::bench5_128k ... bench: 12,732 ns/iter (+/- 119)
test decode_to_slice::const_hex::bench6_1m ... bench: 103,414 ns/iter (+/- 2,402)
test decode_to_slice::faster_hex::bench1_32b ... bench: 6 ns/iter (+/- 0)
test decode_to_slice::faster_hex::bench2_256b ... bench: 28 ns/iter (+/- 0)
test decode_to_slice::faster_hex::bench3_2k ... bench: 206 ns/iter (+/- 3)
test decode_to_slice::faster_hex::bench4_16k ... bench: 1,640 ns/iter (+/- 13)
test decode_to_slice::faster_hex::bench5_128k ... bench: 13,065 ns/iter (+/- 92)
test decode_to_slice::faster_hex::bench6_1m ... bench: 105,963 ns/iter (+/- 2,831)
test decode_to_slice::hex::bench1_32b ... bench: 37 ns/iter (+/- 0)
test decode_to_slice::hex::bench2_256b ... bench: 298 ns/iter (+/- 6)
test decode_to_slice::hex::bench3_2k ... bench: 2,552 ns/iter (+/- 27)
test decode_to_slice::hex::bench4_16k ... bench: 20,335 ns/iter (+/- 581)
test decode_to_slice::hex::bench5_128k ... bench: 611,494 ns/iter (+/- 11,531)
test decode_to_slice::hex::bench6_1m ... bench: 4,941,477 ns/iter (+/- 180,172)
test encode::const_hex::bench1_32b ... bench: 10 ns/iter (+/- 0)
test encode::const_hex::bench2_256b ... bench: 27 ns/iter (+/- 0)
test encode::const_hex::bench3_2k ... bench: 97 ns/iter (+/- 0)
test encode::const_hex::bench4_16k ... bench: 644 ns/iter (+/- 8)
test encode::const_hex::bench5_128k ... bench: 4,967 ns/iter (+/- 52)
test encode::const_hex::bench6_1m ... bench: 45,424 ns/iter (+/- 1,922)
test encode::faster_hex::bench1_32b ... bench: 17 ns/iter (+/- 0)
test encode::faster_hex::bench2_256b ... bench: 36 ns/iter (+/- 0)
test encode::faster_hex::bench3_2k ... bench: 95 ns/iter (+/- 1)
test encode::faster_hex::bench4_16k ... bench: 597 ns/iter (+/- 10)
test encode::faster_hex::bench5_128k ... bench: 4,538 ns/iter (+/- 180)
test encode::faster_hex::bench6_1m ... bench: 41,513 ns/iter (+/- 779)
test encode::hex::bench1_32b ... bench: 97 ns/iter (+/- 0)
test encode::hex::bench2_256b ... bench: 694 ns/iter (+/- 4)
test encode::hex::bench3_2k ... bench: 5,476 ns/iter (+/- 28)
test encode::hex::bench4_16k ... bench: 43,617 ns/iter (+/- 215)
test encode::hex::bench5_128k ... bench: 348,646 ns/iter (+/- 1,155)
test encode::hex::bench6_1m ... bench: 2,895,775 ns/iter (+/- 95,699)
test encode_to_slice::const_hex::bench1_32b ... bench: 1 ns/iter (+/- 0)
test encode_to_slice::const_hex::bench2_256b ... bench: 6 ns/iter (+/- 0)
test encode_to_slice::const_hex::bench3_2k ... bench: 59 ns/iter (+/- 0)
test encode_to_slice::const_hex::bench4_16k ... bench: 438 ns/iter (+/- 2)
test encode_to_slice::const_hex::bench5_128k ... bench: 3,414 ns/iter (+/- 10)
test encode_to_slice::const_hex::bench6_1m ... bench: 28,947 ns/iter (+/- 546)
test encode_to_slice::faster_hex::bench1_32b ... bench: 4 ns/iter (+/- 0)
test encode_to_slice::faster_hex::bench2_256b ... bench: 7 ns/iter (+/- 0)
test encode_to_slice::faster_hex::bench3_2k ... bench: 63 ns/iter (+/- 0)
test encode_to_slice::faster_hex::bench4_16k ... bench: 390 ns/iter (+/- 5)
test encode_to_slice::faster_hex::bench5_128k ... bench: 3,012 ns/iter (+/- 22)
test encode_to_slice::faster_hex::bench6_1m ... bench: 26,138 ns/iter (+/- 596)
test encode_to_slice::hex::bench1_32b ... bench: 11 ns/iter (+/- 0)
test encode_to_slice::hex::bench2_256b ... bench: 116 ns/iter (+/- 0)
test encode_to_slice::hex::bench3_2k ... bench: 971 ns/iter (+/- 6)
test encode_to_slice::hex::bench4_16k ... bench: 7,821 ns/iter (+/- 48)
test encode_to_slice::hex::bench5_128k ... bench: 61,907 ns/iter (+/- 377)
test encode_to_slice::hex::bench6_1m ... bench: 499,203 ns/iter (+/- 3,771)
test format::const_hex::bench1_32b ... bench: 10 ns/iter (+/- 1)
test format::const_hex::bench2_256b ... bench: 18 ns/iter (+/- 0)
test format::const_hex::bench3_2k ... bench: 134 ns/iter (+/- 2)
test format::const_hex::bench4_16k ... bench: 1,151 ns/iter (+/- 5)
test format::const_hex::bench5_128k ... bench: 9,298 ns/iter (+/- 83)
test format::const_hex::bench6_1m ... bench: 83,611 ns/iter (+/- 1,530)
test format::std::bench1_32b ... bench: 359 ns/iter (+/- 6)
test format::std::bench2_256b ... bench: 2,773 ns/iter (+/- 44)
test format::std::bench3_2k ... bench: 22,620 ns/iter (+/- 213)
test format::std::bench4_16k ... bench: 183,197 ns/iter (+/- 1,512)
test format::std::bench5_128k ... bench: 1,481,851 ns/iter (+/- 9,791)
test format::std::bench6_1m ... bench: 11,947,054 ns/iter (+/- 132,579)
```

## Acknowledgements
Expand Down
6 changes: 4 additions & 2 deletions benches/bench/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ pub const ENC_32: &[u8; 32] = include_bytes!("./data_32.bin");
pub const ENC_256: &[u8; 256] = include_bytes!("./data_256.bin");
pub const ENC_2048: &[u8; 2048] = include_bytes!("./data_2048.bin");
pub const ENC_16384: &[u8; 16384] = include_bytes!("./data_16384.bin");
pub const ENC_262144: &[u8; 262144] = include_bytes!("./data_262144.bin");
pub const ENC_131072: &[u8; 131072] = include_bytes!("./data_131072.bin");
pub const ENC_1048576: &[u8; 1048576] = include_bytes!("./data_1048576.bin");

pub const DEC_32: &str = include_str!("./data_32.hex");
pub const DEC_256: &str = include_str!("./data_256.hex");
pub const DEC_2048: &str = include_str!("./data_2048.hex");
pub const DEC_16384: &str = include_str!("./data_16384.hex");
pub const DEC_262144: &str = include_str!("./data_262144.hex");
pub const DEC_131072: &str = include_str!("./data_131072.hex");
pub const DEC_1048576: &str = include_str!("./data_1048576.hex");
2 changes: 1 addition & 1 deletion benches/bench/gen_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

enc_rs = []
dec_rs = []
for i in [32, 256, 2048, 16384, 262144]:
for i in [32, 256, 2048, 16384, 131072, 1048576]:
data = bytearray([random.randint(0, 255) for _ in range(i)])
data_bin_fname = f"data_{i}.bin"
open(f"{ROOT}/{data_bin_fname}", "wb").write(data)
Expand Down
11 changes: 6 additions & 5 deletions benches/bench/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,10 @@ macro_rules! benches {
}

benches! {
bench1_32(data::ENC_32, data::DEC_32)
bench2_256(data::ENC_256, data::DEC_256)
bench3_2048(data::ENC_2048, data::DEC_2048)
bench4_16384(data::ENC_16384, data::DEC_16384)
bench5_262144(data::ENC_262144, data::DEC_262144)
bench1_32b(data::ENC_32, data::DEC_32)
bench2_256b(data::ENC_256, data::DEC_256)
bench3_2k(data::ENC_2048, data::DEC_2048)
bench4_16k(data::ENC_16384, data::DEC_16384)
bench5_128k(data::ENC_131072, data::DEC_131072)
bench6_1m(data::ENC_1048576, data::DEC_1048576)
}

0 comments on commit 5c7478f

Please sign in to comment.