From 7934023f30898b1b54d1870035f486ac6bb3e389 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sat, 26 Oct 2019 12:36:03 -0700 Subject: [PATCH] Add rust and Go benchmarks for encoding json. --- Cargo.lock | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 ++ src/lib.rs | 3 ++ src/vec3.rs | 40 +++++++++++++++++++++++ src/vec3_test.go | 43 +++++++++++++++++++++++++ 5 files changed, 171 insertions(+) create mode 100644 src/lib.rs create mode 100644 src/vec3.rs create mode 100644 src/vec3_test.go diff --git a/Cargo.lock b/Cargo.lock index 15bcdff..9c8eee4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,89 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "itoa" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "proc-macro2" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rustperf" version = "0.1.0" +dependencies = [ + "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", +] +[[package]] +name = "ryu" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_derive" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_json" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "syn" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" +"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" +"checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd" +"checksum serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e" +"checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2" +"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" +"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" diff --git a/Cargo.toml b/Cargo.toml index dd446df..be311a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,8 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" [profile.release] debug = true diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..08560fc --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,3 @@ +#![feature(test)] +mod vec3; +extern crate test; diff --git a/src/vec3.rs b/src/vec3.rs new file mode 100644 index 0000000..9e1d396 --- /dev/null +++ b/src/vec3.rs @@ -0,0 +1,40 @@ +use serde::Serialize; + +#[derive(Default, Debug, Serialize, PartialEq, Copy, Clone)] +pub struct Vec3 { + pub x: f32, + pub y: f32, + pub z: f32, +} + +#[cfg(test)] +mod tests { + use super::*; + use test::Bencher; + + #[test] + fn test_vec3_to_json() { + let vecs = vec![Vec3 { + x: 1.0, + y: 2.0, + z: 3.0, + }]; + assert_eq!( + serde_json::to_string(&vecs).expect("failed to json encode"), + r#"[{"x":1.0,"y":2.0,"z":3.0}]"# + ); + } + + #[bench] + fn bench_vec3_to_json(b: &mut Bencher) { + let vecs: Vec = (0..1000) + .map(|i| Vec3 { + x: 255. * i as f32 / 1000., + y: 255. * i as f32 / 1000., + z: 255. * i as f32 / 1000., + }) + .collect(); + + b.iter(|| serde_json::to_string(&vecs)); + } +} diff --git a/src/vec3_test.go b/src/vec3_test.go new file mode 100644 index 0000000..0a691e0 --- /dev/null +++ b/src/vec3_test.go @@ -0,0 +1,43 @@ +package main + +import ( + "encoding/json" + "reflect" + "testing" +) + +type Vec3 struct { + X float32 `json:"x"` + Y float32 `json:"y"` + Z float32 `json:"z"` +} + +func TestVec3ToJSON(t *testing.T) { + vecs := []Vec3{{X: 1.0, Y: 2.0, Z: 3.0}} + + got, err := json.Marshal(vecs) + if err != nil { + t.Fatalf("Failed to marshal: %v", err) + } + want := []byte(`[{"x":1,"y":2,"z":3}]`) + if !reflect.DeepEqual(want, got) { + t.Fatalf("got != want\nGot: %s\nWant: %s", got, want) + } +} + +func BenchmarkVec3ToJSON(b *testing.B) { + var vecs []Vec3 + + for i := 0; i < 1000; i++ { + vecs = append(vecs, Vec3{ + X: 255. * float32(i) / 1000., + Y: 255. * float32(i) / 1000., + Z: 255. * float32(i) / 1000., + }) + } + for i := 0; i < b.N; i++ { + if _, err := json.Marshal(vecs); err != nil { + b.Fatalf("Failed to marshal: %v", err) + } + } +}