Add rust and Go benchmarks for encoding json.

This commit is contained in:
Bill Thiede 2019-10-26 12:36:03 -07:00
parent 626cfe01bb
commit 7934023f30
5 changed files with 171 additions and 0 deletions

83
Cargo.lock generated
View File

@ -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"

View File

@ -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

3
src/lib.rs Normal file
View File

@ -0,0 +1,3 @@
#![feature(test)]
mod vec3;
extern crate test;

40
src/vec3.rs Normal file
View File

@ -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<Vec3> = (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));
}
}

43
src/vec3_test.go Normal file
View File

@ -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)
}
}
}