From 99652200aa2840e9a3075f238d9eb001aadb7e80 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 22 Apr 2022 18:03:57 +0000 Subject: simplify nbt list optimization --- azalea-nbt/README.md | 5 +---- azalea-nbt/benches/my_benchmark.rs | 17 +++++++++-------- azalea-nbt/src/encode.rs | 28 +++++++++++++--------------- azalea-nbt/src/tag.rs | 27 +++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 27 deletions(-) diff --git a/azalea-nbt/README.md b/azalea-nbt/README.md index 0573bce2..19498cf3 100755 --- a/azalea-nbt/README.md +++ b/azalea-nbt/README.md @@ -1,6 +1,3 @@ # Azalea NBT -Deserialize Minecraft NBT. This is somewhat based on [Hermatite NBT](https://github.com/PistonDevelopers/hematite_nbt). - - - +A fast NBT serializer and deserializer. diff --git a/azalea-nbt/benches/my_benchmark.rs b/azalea-nbt/benches/my_benchmark.rs index 51e574e3..528475d3 100755 --- a/azalea-nbt/benches/my_benchmark.rs +++ b/azalea-nbt/benches/my_benchmark.rs @@ -25,17 +25,18 @@ fn bench_serialize(filename: &str, c: &mut Criterion) { .block_on(async { Tag::read(&mut decoded_src_stream).await.unwrap() }); let mut group = c.benchmark_group(filename); + group.sample_size(1000); group.throughput(Throughput::Bytes(decoded_src.len() as u64)); - group.bench_function("Decode", |b| { - b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { - let mut owned_decoded_src_stream = decoded_src_stream.clone(); - owned_decoded_src_stream.seek(SeekFrom::Start(0)).unwrap(); - Tag::read(&mut owned_decoded_src_stream).await.unwrap(); - }) - }); + // group.bench_function("Decode", |b| { + // b.to_async(tokio::runtime::Runtime::new().unwrap()) + // .iter(|| async { + // let mut owned_decoded_src_stream = decoded_src_stream.clone(); + // owned_decoded_src_stream.seek(SeekFrom::Start(0)).unwrap(); + // Tag::read(&mut owned_decoded_src_stream).await.unwrap(); + // }) + // }); group.bench_function("Encode", |b| { b.iter(|| { diff --git a/azalea-nbt/src/encode.rs b/azalea-nbt/src/encode.rs index ebd1070f..ef72dce2 100755 --- a/azalea-nbt/src/encode.rs +++ b/azalea-nbt/src/encode.rs @@ -54,29 +54,27 @@ impl Tag { match first_tag { Self::Int(_) => { for i in value { - if let Tag::Int(v) = i { - writer.write_i32::(*v)? - } else { - panic!("List of Ints should only contain Ints") - } + writer.write_i32::( + *i.as_int().expect("List of Int should only contains Int"), + )?; } } Self::String(_) => { for i in value { - if let Tag::String(v) = i { - write_string(writer, v)?; - } else { - panic!("List of Strings should only contain Strings") - } + write_string( + writer, + i.as_string() + .expect("List of String should only contain String"), + )?; } } &Self::Compound(_) => { for i in value { - if let Tag::Compound(v) = i { - write_compound(writer, v)?; - } else { - panic!("List of Compounds should only contain Compounds") - } + write_compound( + writer, + i.as_compound() + .expect("List of Compound should only contain Compound"), + )?; } } _ => { diff --git a/azalea-nbt/src/tag.rs b/azalea-nbt/src/tag.rs index f11b8889..705dff6a 100755 --- a/azalea-nbt/src/tag.rs +++ b/azalea-nbt/src/tag.rs @@ -36,4 +36,31 @@ impl Tag { Tag::LongArray(_) => 12, } } + + #[inline] + pub fn as_int(&self) -> Option<&i32> { + if let Tag::Int(v) = self { + Some(v) + } else { + None + } + } + + #[inline] + pub fn as_string(&self) -> Option<&str> { + if let Tag::String(v) = self { + Some(v) + } else { + None + } + } + + #[inline] + pub fn as_compound(&self) -> Option<&HashMap> { + if let Tag::Compound(v) = self { + Some(v) + } else { + None + } + } } -- cgit v1.2.3