diff --git a/README.md b/README.md index 59666b3..15948ac 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/benches/bench/data.rs b/benches/bench/data.rs index 9f86039..917d61c 100644 --- a/benches/bench/data.rs +++ b/benches/bench/data.rs @@ -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"); diff --git a/benches/bench/gen_data.py b/benches/bench/gen_data.py index 12e147a..0e94759 100755 --- a/benches/bench/gen_data.py +++ b/benches/bench/gen_data.py @@ -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) diff --git a/benches/bench/main.rs b/benches/bench/main.rs index 6972dde..cf23706 100644 --- a/benches/bench/main.rs +++ b/benches/bench/main.rs @@ -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) }