From 8de2cc375f843227b6b38db9c719ffef0aa033e8 Mon Sep 17 00:00:00 2001 From: Brandon W Maister Date: Sat, 23 Nov 2019 18:21:16 -0500 Subject: [PATCH 1/2] switch to using criterion for benchmarks It has a ton of great features[1], including stronger statistical signifance tests, making comparisons to previous or baseline runs, nice plots, and being able to be run on stable. 1: https://bheisler.github.io/criterion.rs/book/ --- CHANGELOG.md | 6 +++++ Cargo.toml | 5 ++++ benches/parsing.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 benches/parsing.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 43f9b85..d7c8c17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,12 @@ Chrono obeys the principle of [Semantic Versioning](http://semver.org/). There were/are numerous minor versions before 1.0 due to the language changes. Versions with only mechanical changes will be omitted from the following list. +## next + +### Internal improvements + +* Use Criterion for benchmarks (@quodlibetor) + ## 0.4.10 ### Improvements diff --git a/Cargo.toml b/Cargo.toml index 9c59752..d7cac6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,6 +48,7 @@ serde_derive = { version = "1", default-features = false } bincode = { version = "0.8.0" } num-iter = { version = "0.1.35", default-features = false } doc-comment = "0.3" +criterion = "0.3" [target.'cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))'.dev-dependencies] wasm-bindgen-test = "0.2" @@ -57,3 +58,7 @@ all-features = true [package.metadata.playground] all-features = true + +[[bench]] +name = "parsing" +harness = false diff --git a/benches/parsing.rs b/benches/parsing.rs new file mode 100644 index 0000000..4c051ef --- /dev/null +++ b/benches/parsing.rs @@ -0,0 +1,62 @@ +extern crate chrono; +extern crate criterion; + +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use chrono::prelude::*; +use chrono::{Utc, FixedOffset, DateTime}; + +fn bench_datetime_parse_from_rfc2822(c: &mut Criterion) { + c.bench_function("bench_datetime_parse_from_rfc2822", |b| { + b.iter(|| { + let str = black_box("Wed, 18 Feb 2015 23:16:09 +0000"); + DateTime::parse_from_rfc2822(str).unwrap() + }) + }); +} + +fn bench_datetime_parse_from_rfc3339(c: &mut Criterion) { + c.bench_function("bench_datetime_parse_from_rfc3339", |b| { + b.iter(|| { + let str = black_box("2015-02-18T23:59:60.234567+05:00"); + DateTime::parse_from_rfc3339(str).unwrap() + }) + }); +} + +fn bench_datetime_from_str(c: &mut Criterion) { + c.bench_function("bench_datetime_from_str", |b| { + b.iter(|| { + use std::str::FromStr; + let str = black_box("2019-03-30T18:46:57.193Z"); + DateTime::::from_str(str).unwrap() + }) + }); +} + +fn bench_datetime_to_rfc2822(c: &mut Criterion) { + let pst = FixedOffset::east(8 * 60 * 60); + let dt = pst.ymd(2018, 1, 11).and_hms_nano(10, 5, 13, 084_660_000); + c.bench_function("bench_datetime_to_rfc2822", |b| { + b.iter(|| black_box(dt).to_rfc2822()) + }); +} + +fn bench_datetime_to_rfc3339(c: &mut Criterion) { + let pst = FixedOffset::east(8 * 60 * 60); + let dt = pst.ymd(2018, 1, 11).and_hms_nano(10, 5, 13, 084_660_000); + c.bench_function("bench_datetime_to_rfc3339", |b| { + b.iter(|| black_box(dt).to_rfc3339()) + }); +} + +criterion_group!( + benches, + bench_datetime_parse_from_rfc2822, + bench_datetime_parse_from_rfc3339, + bench_datetime_from_str, + bench_datetime_to_rfc2822, + bench_datetime_to_rfc3339 +); + +criterion_main!(benches); From 80da04381ce6089af2799ebaa47ddf4e4bbbcdc4 Mon Sep 17 00:00:00 2001 From: Brandon W Maister Date: Sun, 24 Nov 2019 14:50:33 -0500 Subject: [PATCH 2/2] add serialization benchmark --- Cargo.toml | 5 +++++ benches/serde.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 benches/serde.rs diff --git a/Cargo.toml b/Cargo.toml index d7cac6e..945901c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,3 +62,8 @@ all-features = true [[bench]] name = "parsing" harness = false + +[[bench]] +name = "serde" +harness = false +required-features = ["serde"] diff --git a/benches/serde.rs b/benches/serde.rs new file mode 100644 index 0000000..860b06e --- /dev/null +++ b/benches/serde.rs @@ -0,0 +1,30 @@ +extern crate chrono; +extern crate criterion; + +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use chrono::NaiveDateTime; + +fn bench_ser_naivedatetime_string(c: &mut Criterion) { + c.bench_function("bench_ser_naivedatetime_string", |b| { + let dt: NaiveDateTime = "2000-01-01T00:00:00".parse().unwrap(); + b.iter(|| { + black_box(serde_json::to_string(&dt)).unwrap(); + }); + }); +} + +fn bench_ser_naivedatetime_writer(c: &mut Criterion) { + c.bench_function("bench_ser_naivedatetime_writer", |b| { + let mut s: Vec = Vec::with_capacity(20); + let dt: NaiveDateTime = "2000-01-01T00:00:00".parse().unwrap(); + b.iter(|| { + let s = &mut s; + s.clear(); + black_box(serde_json::to_writer(s, &dt)).unwrap(); + }); + }); +} + +criterion_group!(benches, bench_ser_naivedatetime_writer, bench_ser_naivedatetime_string); +criterion_main!(benches);