diff options
| -rw-r--r-- | Cargo.lock | 60 | ||||
| -rw-r--r-- | azalea-nbt/Cargo.toml | 3 | ||||
| -rwxr-xr-x | azalea-nbt/benches/comparison.rs | 126 | ||||
| -rwxr-xr-x | azalea-nbt/benches/my_benchmark.rs | 26 |
4 files changed, 82 insertions, 133 deletions
@@ -355,11 +355,10 @@ dependencies = [ "compact_str", "criterion", "enum-as-inner", + "fastnbt", "flate2", "graphite_binary", - "hematite-nbt", "log", - "quartz_nbt", "serde", "valence_nbt", ] @@ -1080,6 +1079,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] +name = "fastnbt" +version = "2.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1aab2b0109236f6c89cc81b9e2ef4aced6d585aabe96ac860ee5e9a102eb198" +dependencies = [ + "byteorder", + "cesu8", + "serde", + "serde_bytes", +] + +[[package]] name = "fastrand" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1329,18 +1340,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] -name = "hematite-nbt" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670d0784ee67cfb57393dc1837867d2951f9a59ca7db99a653499c854f745739" -dependencies = [ - "byteorder", - "cesu8", - "flate2", - "serde", -] - -[[package]] name = "hermit-abi" version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1869,30 +1868,6 @@ dependencies = [ ] [[package]] -name = "quartz_nbt" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348031720b71761481d77969dcb3c89ab06f04132ee1503aca1bd9313eef5e67" -dependencies = [ - "anyhow", - "byteorder", - "cesu8", - "flate2", - "quartz_nbt_macros", -] - -[[package]] -name = "quartz_nbt_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "289baa0c8a4d1f840d2de528a7f8c29e0e9af48b3018172b3edad4f716e8daed" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] name = "quote" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2148,6 +2123,15 @@ dependencies = [ ] [[package]] +name = "serde_bytes" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +dependencies = [ + "serde", +] + +[[package]] name = "serde_derive" version = "1.0.155" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/azalea-nbt/Cargo.toml b/azalea-nbt/Cargo.toml index 59b52762..4f01e254 100644 --- a/azalea-nbt/Cargo.toml +++ b/azalea-nbt/Cargo.toml @@ -21,9 +21,8 @@ serde = { version = "1.0.152", features = ["derive"], optional = true } [dev-dependencies] criterion = { version = "^0.4.0", features = ["html_reports"] } graphite_binary = "0.1.0" -quartz_nbt = "0.2.6" -hematite-nbt = "0.5.2" valence_nbt = "0.4.0" +fastnbt = "2.4.3" [features] default = [] diff --git a/azalea-nbt/benches/comparison.rs b/azalea-nbt/benches/comparison.rs index 8ff2a54b..7aede267 100755 --- a/azalea-nbt/benches/comparison.rs +++ b/azalea-nbt/benches/comparison.rs @@ -1,28 +1,36 @@ -use std::io::Cursor; +use std::{ + fs::File, + io::{Cursor, Read}, +}; use azalea_buf::McBufReadable; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput}; +use flate2::read::GzDecoder; -use nbt as hematite_nbt; -use quartz_nbt::io::Flavor; +pub fn bench_read_file(filename: &str, c: &mut Criterion) { + let mut file = File::open(filename).unwrap(); + let mut contents = Vec::new(); + file.read_to_end(&mut contents).unwrap(); + let mut src = &contents[..]; -pub fn nbt_parse_bigtest(c: &mut Criterion) { - let original = include_bytes!("../tests/bigtest.nbt").to_vec(); - let mut original_stream = Cursor::new(original); - let original_tag = azalea_nbt::Tag::read_gzip(&mut original_stream).unwrap(); + // 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 input = Vec::new(); - original_tag.write(&mut input).unwrap(); + decoded_src_decoder.read_to_end(&mut input).unwrap(); let input = input.as_slice(); - c.bench_function("azalea_parse_bigtest", |b| { + let mut group = c.benchmark_group(filename); + group.throughput(Throughput::Bytes(input.len() as u64)); + + group.bench_function("azalea_parse", |b| { b.iter(|| { let input = black_box(input); - let nbt = azalea_nbt::Tag::read(&mut Cursor::new(input)).unwrap(); + let nbt = azalea_nbt::Tag::read(&mut Cursor::new(&input)).unwrap(); black_box(nbt); }) }); - c.bench_function("graphite_parse_bigtest", |b| { + group.bench_function("graphite_parse", |b| { b.iter(|| { let input = black_box(input); let nbt = graphite_binary::nbt::decode::read(&mut &input[..]).unwrap(); @@ -30,7 +38,7 @@ pub fn nbt_parse_bigtest(c: &mut Criterion) { }) }); - c.bench_function("valence_parse_bigtest", |b| { + group.bench_function("valence_parse", |b| { b.iter(|| { let input = black_box(input); let nbt = valence_nbt::from_binary_slice(&mut &input[..]).unwrap(); @@ -38,88 +46,46 @@ pub fn nbt_parse_bigtest(c: &mut Criterion) { }) }); - // c.bench_function("hematite_parse_bigtest", |b| { - // b.iter(|| { - // let input = black_box(input); - - // let cursor = Cursor::new(input); - // let blob: hematite_nbt::Blob = - // hematite_nbt::from_reader(cursor).unwrap(); black_box(blob); - // }) - // }); + // // writing - // c.bench_function("quartz_parse_bigtest", |b| { + // let nbt = azalea_nbt::Tag::read_from(&mut Cursor::new(input)).unwrap(); + // group.bench_function("azalea_write", |b| { // b.iter(|| { - // let input = black_box(input); - - // let mut cursor = Cursor::new(input); - // let nbt = quartz_nbt::io::read_nbt(&mut cursor, - // Flavor::Uncompressed).unwrap(); black_box(nbt); + // let nbt = black_box(&nbt); + // let mut written = Vec::new(); + // nbt.write(&mut written).unwrap(); + // black_box(written); // }) // }); -} -pub fn nbt_write_bigtest(c: &mut Criterion) { - let original = include_bytes!("../tests/bigtest.nbt").to_vec(); - let mut original_stream = Cursor::new(original); - let original_tag = azalea_nbt::Tag::read_gzip(&mut original_stream).unwrap(); - let mut input = Vec::new(); - original_tag.write(&mut input).unwrap(); - let input = input.as_slice(); - - let mut cursor = Cursor::new(input); - let nbt = azalea_nbt::Tag::read_from(&mut cursor).unwrap(); - c.bench_function("azalea_write_bigtest", |b| { - b.iter(|| { - let nbt = black_box(&nbt); - let mut written = Vec::new(); - nbt.write(&mut written).unwrap(); - black_box(written); - }) - }); - - let nbt = graphite_binary::nbt::decode::read(&mut &input[..]).unwrap(); - c.bench_function("graphite_write_bigtest", |b| { - b.iter(|| { - let nbt = black_box(&nbt); - let written = graphite_binary::nbt::encode::write(nbt); - black_box(written); - }) - }); - - let nbt = valence_nbt::from_binary_slice(&mut &input[..]).unwrap(); - c.bench_function("valence_write_bigtest", |b| { - b.iter(|| { - let nbt = black_box(&nbt); - let mut written = Vec::new(); - valence_nbt::to_binary_writer(&mut written, &nbt.0, &nbt.1).unwrap(); - black_box(written); - }) - }); - - // let cursor = Cursor::new(input); - // let nbt: hematite_nbt::Blob = hematite_nbt::from_reader(cursor).unwrap(); - // c.bench_function("hematite_write_bigtest", |b| { + // let nbt = graphite_binary::nbt::decode::read(&mut &input[..]).unwrap(); + // group.bench_function("graphite_write", |b| { // b.iter(|| { // let nbt = black_box(&nbt); - // let mut written = Vec::new(); - // hematite_nbt::to_writer(&mut written, nbt, None).unwrap(); + // let written = graphite_binary::nbt::encode::write(nbt); // black_box(written); // }) // }); - // let mut cursor = Cursor::new(input); - // let (nbt, _) = quartz_nbt::io::read_nbt(&mut cursor, - // Flavor::Uncompressed).unwrap(); c.bench_function(" - // quartz_write_bigtest", |b| { b.iter(|| { + // let nbt = valence_nbt::from_binary_slice(&mut &input[..]).unwrap(); + // group.bench_function("valence_write", |b| { + // b.iter(|| { // let nbt = black_box(&nbt); // let mut written = Vec::new(); - // quartz_nbt::io::write_nbt(&mut written, None, nbt, - // Flavor::Uncompressed).unwrap(); black_box(written); + // valence_nbt::to_binary_writer(&mut written, &nbt.0, + // &nbt.1).unwrap(); black_box(written); // }) // }); } -// criterion_group!(benches, nbt_write_bigtest); -criterion_group!(benches, nbt_parse_bigtest, nbt_write_bigtest); +fn bench(c: &mut Criterion) { + bench_read_file("tests/bigtest.nbt", c); + // bench_read_file("tests/simple_player.dat", c); + // bench_read_file("tests/complex_player.dat", c); + // bench_read_file("tests/level.dat", c); + // bench_read_file("tests/stringtest.nbt", c); + // bench_read_file("tests/inttest.nbt", c); +} + +criterion_group!(benches, bench); criterion_main!(benches); diff --git a/azalea-nbt/benches/my_benchmark.rs b/azalea-nbt/benches/my_benchmark.rs index 5987e533..7ce11e1f 100755 --- a/azalea-nbt/benches/my_benchmark.rs +++ b/azalea-nbt/benches/my_benchmark.rs @@ -6,7 +6,7 @@ use std::{ io::{self, Cursor, Read}, }; -fn bench_serialize(filename: &str, c: &mut Criterion) { +fn bench_file(filename: &str, c: &mut Criterion) { let mut file = File::open(filename).unwrap(); let mut contents = Vec::new(); file.read_to_end(&mut contents).unwrap(); @@ -26,12 +26,12 @@ fn bench_serialize(filename: &str, c: &mut Criterion) { group.throughput(Throughput::Bytes(decoded_src.len() as u64)); - // group.bench_function("Decode", |b| { - // b.iter(|| { - // black_box(Tag::read(&mut decoded_src_stream).unwrap()); - // decoded_src_stream.set_position(0); - // }) - // }); + group.bench_function("Decode", |b| { + b.iter(|| { + black_box(Tag::read(&mut decoded_src_stream).unwrap()); + decoded_src_stream.set_position(0); + }) + }); group.bench_function("Encode", |b| { b.iter(|| { @@ -42,12 +42,12 @@ 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/stringtest.nbt", c); - // bench_serialize("tests/inttest.nbt", c); + bench_file("tests/bigtest.nbt", c); + bench_file("tests/simple_player.dat", c); + bench_file("tests/complex_player.dat", c); + bench_file("tests/level.dat", c); + bench_file("tests/stringtest.nbt", c); + bench_file("tests/inttest.nbt", c); } criterion_group!(benches, bench); |
