Pre-allocate 1K buffer for Json deserialization#572
Closed
messense wants to merge 1 commit into
Closed
Conversation
Member
|
My guess is that Also, you should benchmark with payloads of varying sizes including much less than the pre-allocated amount, less than the pre-allocated amount, about the pre-allocated amount, a bit more than the pre-allocated amount, and much more than the pre-allocated amount. |
Contributor
Author
|
Here is an micro-benchmark: #![feature(test)]
extern crate test;
extern crate serde;
#[macro_use] extern crate serde_derive;
extern crate serde_json;
use std::io::{Read, Cursor};
use test::Bencher;
use serde::de::DeserializeOwned;
use serde_json::error::Error as SerdeError;
fn from_reader_eager<R, T>(mut reader: R, buffer_size: usize) -> serde_json::Result<T>
where R: Read, T: DeserializeOwned
{
let mut s = String::with_capacity(buffer_size);
if let Err(io_err) = reader.read_to_string(&mut s) {
// Error::io is private to serde_json. Do not use outside of Rocket.
return Err(SerdeError::io(io_err));
}
serde_json::from_str(&s)
}
#[derive(Deserialize)]
struct Message {
contents: String,
}
#[bench]
fn bench_small_0(b: &mut Bencher) {
b.iter(|| {
let cursor = Cursor::new("{\"contents\": \"Hello World!\"}".to_string());
let v: Message = from_reader_eager(cursor, 0).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_small_512(b: &mut Bencher) {
b.iter(|| {
let cursor = Cursor::new("{\"contents\": \"Hello World!\"}".to_string());
let v: Message = from_reader_eager(cursor, 512).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_small_1024(b: &mut Bencher) {
b.iter(|| {
let cursor = Cursor::new("{\"contents\": \"Hello World!\"}".to_string());
let v: Message = from_reader_eager(cursor, 1024).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_small_4096(b: &mut Bencher) {
b.iter(|| {
let cursor = Cursor::new("{\"contents\": \"Hello World!\"}".to_string());
let v: Message = from_reader_eager(cursor, 4096).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_medium_0(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(50);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 0).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_medium_512(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(50);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 512).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_medium_1024(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(50);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 1024).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_medium_4096(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(50);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 4096).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_large_0(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(200);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 0).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_large_512(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(200);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 512).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_large_1024(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(200);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 1024).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_large_4096(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(200);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 4096).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_very_large_0(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(1000);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 0).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_very_large_512(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(1000);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 512).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_very_large_1024(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(1000);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 1024).unwrap();
assert!(v.contents.len() > 0);
});
}
#[bench]
fn bench_very_large_4096(b: &mut Bencher) {
b.iter(|| {
let s = "Hello World!".repeat(1000);
let input = format!("{{\"contents\": \"{}\"}}", s);
let cursor = Cursor::new(input);
let v: Message = from_reader_eager(cursor, 4096).unwrap();
assert!(v.contents.len() > 0);
});
}Result on my MacBook Pro (Retina, 15-inch, Mid 2015) (2.2 GHz Intel Core i7, 16 GB 1600 MHz DDR3) |
Member
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Performance implications with different buffer size lower bounds was measured here