From f50cdfccfcdd8e3ceb5e643a051e1b2da87ebcd3 Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 19 Dec 2021 20:20:43 -0600 Subject: [PATCH] ::with_capacity instead of ::new for vecs in nbt --- azalea-nbt/benches/my_benchmark.rs | 22 +++++++++++++++------- azalea-nbt/src/decode.rs | 13 +++++++------ azalea-nbt/tests/level.dat | Bin 0 -> 1922 bytes azalea-nbt/tests/tests.rs | 4 ---- 4 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 azalea-nbt/tests/level.dat diff --git a/azalea-nbt/benches/my_benchmark.rs b/azalea-nbt/benches/my_benchmark.rs index 30de196c..3d7eaeee 100644 --- a/azalea-nbt/benches/my_benchmark.rs +++ b/azalea-nbt/benches/my_benchmark.rs @@ -1,5 +1,6 @@ use azalea_nbt::Tag; use criterion::{criterion_group, criterion_main, Criterion, Throughput}; +use flate2::read::GzDecoder; use std::{ fs::File, io::{self, Read, Seek, SeekFrom}, @@ -10,18 +11,25 @@ fn bench_serialize(filename: &str, c: &mut Criterion) { let mut contents = Vec::new(); file.read_to_end(&mut contents).unwrap(); let mut src = std::io::Cursor::new(&contents[..]); + + // decode the original src so most of the time isn't spent on unzipping + let mut decoded_src_decoder = GzDecoder::new(&mut src); + let mut decoded_src = Vec::new(); + decoded_src_decoder.read_to_end(&mut decoded_src).unwrap(); + let mut decoded_src_stream = std::io::Cursor::new(decoded_src); + file.seek(SeekFrom::Start(0)).unwrap(); let nbt = Tag::read_gzip(&mut file).unwrap(); let mut group = c.benchmark_group(filename); group.throughput(Throughput::Bytes(contents.len() as u64)); - group.bench_function("Deserialize As Blob", |b| { + group.bench_function("Decode", |b| { b.iter(|| { - src.seek(SeekFrom::Start(0)).unwrap(); - Tag::read_gzip(&mut src).unwrap(); + decoded_src_stream.seek(SeekFrom::Start(0)).unwrap(); + Tag::read(&mut decoded_src_stream).unwrap(); }) }); - group.bench_function("Serialize As Blob", |b| { + group.bench_function("Encode", |b| { b.iter(|| { nbt.write(&mut io::sink()).unwrap(); }) @@ -31,9 +39,9 @@ fn bench_serialize(filename: &str, c: &mut Criterion) { fn bench(c: &mut Criterion) { bench_serialize("tests/bigtest.nbt", c); - // bench_serialize::("tests/simple_player.dat", c); - // bench_serialize::("tests/complex_player.dat", c); - // bench_serialize::("tests/level.dat", c); + // bench_serialize("tests/simple_player.dat", c); + // bench_serialize("tests/complex_player.dat", c); + bench_serialize("tests/level.dat", c); } criterion_group!(benches, bench); diff --git a/azalea-nbt/src/decode.rs b/azalea-nbt/src/decode.rs index a0a4ba8c..f7cda3f9 100644 --- a/azalea-nbt/src/decode.rs +++ b/azalea-nbt/src/decode.rs @@ -28,7 +28,7 @@ impl Tag { // integer (thus 4 bytes) 7 => { let length = stream.read_i32::().map_err(|_| Error::InvalidTag)?; - let mut bytes = Vec::new(); + let mut bytes = Vec::with_capacity(length as usize); for _ in 0..length { bytes.push(stream.read_i8().map_err(|_| Error::InvalidTag)?); } @@ -39,7 +39,7 @@ impl Tag { // string in bytes 8 => { let length = stream.read_u16::().map_err(|_| Error::InvalidTag)?; - let mut bytes = Vec::new(); + let mut bytes = Vec::with_capacity(length as usize); for _ in 0..length { bytes.push(stream.read_u8().map_err(|_| Error::InvalidTag)?); } @@ -56,7 +56,7 @@ impl Tag { 9 => { let type_id = stream.read_u8().map_err(|_| Error::InvalidTag)?; let length = stream.read_i32::().map_err(|_| Error::InvalidTag)?; - let mut list = Vec::new(); + let mut list = Vec::with_capacity(length as usize); for _ in 0..length { list.push(Tag::read_known(stream, type_id)?); } @@ -64,7 +64,8 @@ impl Tag { } // Effectively a list of a named tags. Order is not guaranteed. 10 => { - let mut map = HashMap::new(); + // we default to capacity 4 because it'll probably not be empty + let mut map = HashMap::with_capacity(4); loop { let tag_id = stream.read_u8().unwrap_or(0); if tag_id == 0 { @@ -84,7 +85,7 @@ impl Tag { // integers. 11 => { let length = stream.read_i32::().map_err(|_| Error::InvalidTag)?; - let mut ints = Vec::new(); + let mut ints = Vec::with_capacity(length as usize); for _ in 0..length { ints.push(stream.read_i32::().map_err(|_| Error::InvalidTag)?); } @@ -94,7 +95,7 @@ impl Tag { // integer (thus 4 bytes) and indicates the number of 8 byte longs. 12 => { let length = stream.read_i32::().map_err(|_| Error::InvalidTag)?; - let mut longs = Vec::new(); + let mut longs = Vec::with_capacity(length as usize); for _ in 0..length { longs.push(stream.read_i64::().map_err(|_| Error::InvalidTag)?); } diff --git a/azalea-nbt/tests/level.dat b/azalea-nbt/tests/level.dat new file mode 100644 index 0000000000000000000000000000000000000000..e5d11b8c7888ac809810f12a86313a504c6a701f GIT binary patch literal 1922 zcmV-|2YvV-iwFP!000000M%DZj2uT9{(E}f-r1dfIKd(a6GTuD7)Rz2VVT|8on3pQ zeQ9SMFD7EC>8_b6O?OvQU9;;k2gDUwLWn~!${`X6B#5{q93nviD3=6VIdDQ85C{5hf!iIW_deo8B-IUaC zd0Z-!JXEe<-)wGCTa_br; zp6nGNze*yy@;QiqiRFhA%YJ}-+r;Vb(}+cq1P(PAfHBP3baj4AeHzGCNU3YAmtVho z_hmG$KxLb|ti!0#+^ht>5OT?Qpurk={+X83nTZHF|P;B^o z5Xj{}#vA0JtU%j5lHdEq&z}Eczxjg^#ifKIkrI7s5}$Mvf0q9lyYs#b=Wb9E^5DF0 zX0!Bu{NhWCKf3bEcgN^KN^j+fc=Zgu-!EVPgZsknvuexYw)Vb=7IqTXH(y&Q{O-Fi zJe`aSu-M_;UBA^MgGgC#(PQeZoa;7hsHvF)=JZwZ2++%v4nu8$gG)Im#tDZd8;XZv z3j_Sr#oWgWP*C4D8ZWEboynG18FI{p$9)!1N05&ElFNwC1NSI8;ljlQapPVpwCpQ;7ltdC&3064xTE^D{ z3A>5`<|cs=B}X0!Bo)CF;IaYQ2Kb>7P*69LJfKIIai=#0YZ+{Q8ryc;qZ&R1ST?|d z0nTOEJ`732Uoep3sgObf$r(s#k{(r;$x%p&@TSn4HNf)ZUQQ34ngXdANX0-KjL$T4Ah}md9FcZfyQh-D`G-NUB;FvSKt! z+m}1(024eo@@Th<5-#JwJ7W%H_*(J)`Lxw1t5dW36WP2G*~1g9Q;rN}CMB0o-2x`I z=uCFQBm+I_`7~2jKRI=ID~({Xd>1d%TEmg-n67s^s1dX@!jh>p{Ls^K2~OckZ064f+sL!sqxfpecauwVwo#K1%S zNbsV-&{vu&hp}2m&AqNVv=UB{QET>LxVL=S|62j-jdsLEsQii5pfbooRkJsW4V~Ey zt_qxWG5qCg10mz3Gm5eP;OhtPUD{c-VNT7j>ZbyVaz8`{e@6CA90!rno|wc26V|6I zVDIrrOUsql?mzXb%Xe2-_I{&DuH13n_~u_e@^d3CTSS_$Cn3O)%94V=^;PthS|0~V~<@4GrU;AsrC6A$59jk>dV4iS&trmi(+c9@vqvu&RQF87sy{tW-qgTJr8 zeys@A*tmt*#+{d*H8im^$GLd!*F{(wnQT!J9uU!`GBM6WJ|Sp5DehybqtpCkjr%_C z7Gi|i-6K?##&iQ~Sv~QSxvI-m$5hWrD0GMyDGz+!zA6~) zWW1Ua`Y0$nePY47ggj7$5AgNXr0qd>GwASiiCQ1KUHTw1pVc`{o-0M_Hf+5i9m literal 0 HcmV?d00001 diff --git a/azalea-nbt/tests/tests.rs b/azalea-nbt/tests/tests.rs index 2c69745b..b6bc1023 100644 --- a/azalea-nbt/tests/tests.rs +++ b/azalea-nbt/tests/tests.rs @@ -1,8 +1,4 @@ use azalea_nbt::Tag; -use flate2::{ - read::{GzDecoder, ZlibDecoder}, - write::{GzEncoder, ZlibEncoder}, -}; use std::{ collections::HashMap, io::{Cursor, Read},