Revision control

Copy as Markdown

Other Tools

use std::io;
use criterion::Bencher;
use time::format_description;
use time::format_description::well_known::{Rfc2822, Rfc3339};
use time::macros::{date, datetime, format_description as fd, offset, time};
setup_benchmark! {
"Formatting",
fn format_rfc3339(ben: &mut Bencher<'_>) {
macro_rules! item {
($value:expr) => {
$value.format_into(&mut io::sink(), &Rfc3339)
}
}
ben.iter(|| item!(datetime!(2021-01-02 03:04:05 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.1 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.12 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123_4 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123_45 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123_456 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123_456_7 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123_456_78 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123_456_789 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123_456_789 -01:02)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05.123_456_789 +01:02)));
}
fn format_rfc2822(ben: &mut Bencher<'_>) {
macro_rules! item {
($value:expr) => {
$value.format_into(&mut io::sink(), &Rfc2822)
}
}
ben.iter(|| item!(datetime!(2021-01-02 03:04:05 UTC)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05 +06:07)));
ben.iter(|| item!(datetime!(2021-01-02 03:04:05 -06:07)));
}
fn format_time(ben: &mut Bencher<'_>) {
macro_rules! item {
($format:expr) => {
time!(13:02:03.456_789_012).format_into(
&mut io::sink(),
&$format,
)
}
}
ben.iter(|| item!(fd!("[hour]")));
ben.iter(|| item!(fd!("[hour repr:12]")));
ben.iter(|| item!(fd!("[hour repr:12 padding:none]")));
ben.iter(|| item!(fd!("[hour repr:12 padding:space]")));
ben.iter(|| item!(fd!("[hour repr:24]")));
ben.iter(|| item!(fd!("[hour repr:24]")));
ben.iter(|| item!(fd!("[hour repr:24 padding:none]")));
ben.iter(|| item!(fd!("[hour repr:24 padding:space]")));
ben.iter(|| item!(fd!("[minute]")));
ben.iter(|| item!(fd!("[minute padding:none]")));
ben.iter(|| item!(fd!("[minute padding:space]")));
ben.iter(|| item!(fd!("[minute padding:zero]")));
ben.iter(|| item!(fd!("[period]")));
ben.iter(|| item!(fd!("[period case:upper]")));
ben.iter(|| item!(fd!("[period case:lower]")));
ben.iter(|| item!(fd!("[second]")));
ben.iter(|| item!(fd!("[second padding:none]")));
ben.iter(|| item!(fd!("[second padding:space]")));
ben.iter(|| item!(fd!("[second padding:zero]")));
ben.iter(|| item!(fd!("[subsecond]")));
ben.iter(|| item!(fd!("[subsecond digits:1]")));
ben.iter(|| item!(fd!("[subsecond digits:2]")));
ben.iter(|| item!(fd!("[subsecond digits:3]")));
ben.iter(|| item!(fd!("[subsecond digits:4]")));
ben.iter(|| item!(fd!("[subsecond digits:5]")));
ben.iter(|| item!(fd!("[subsecond digits:6]")));
ben.iter(|| item!(fd!("[subsecond digits:7]")));
ben.iter(|| item!(fd!("[subsecond digits:8]")));
ben.iter(|| item!(fd!("[subsecond digits:9]")));
ben.iter(|| item!(fd!("[subsecond digits:1+]")));
}
fn display_time(ben: &mut Bencher<'_>) {
ben.iter(|| time!(0:00).to_string());
ben.iter(|| time!(23:59).to_string());
ben.iter(|| time!(23:59:59).to_string());
ben.iter(|| time!(0:00:01).to_string());
ben.iter(|| time!(0:00:00.001).to_string());
ben.iter(|| time!(0:00:00.000_001).to_string());
ben.iter(|| time!(0:00:00.000_000_001).to_string());
}
fn format_date(ben: &mut Bencher<'_>) {
macro_rules! item {
($format:expr) => {
date!(2019-12-31).format_into(&mut io::sink(), &$format)
}
}
ben.iter(|| item!(fd!("[day]")));
ben.iter(|| item!(fd!("[month]")));
ben.iter(|| item!(fd!("[month repr:short]")));
ben.iter(|| item!(fd!("[month repr:long]")));
ben.iter(|| item!(fd!("[ordinal]")));
ben.iter(|| item!(fd!("[weekday]")));
ben.iter(|| item!(fd!("[weekday repr:short]")));
ben.iter(|| item!(fd!("[weekday repr:sunday]")));
ben.iter(|| item!(fd!("[weekday repr:sunday one_indexed:false]")));
ben.iter(|| item!(fd!("[weekday repr:monday]")));
ben.iter(|| item!(fd!("[weekday repr:monday one_indexed:false]")));
ben.iter(|| item!(fd!("[week_number]")));
ben.iter(|| item!(fd!("[week_number padding:none]")));
ben.iter(|| item!(fd!("[week_number padding:space]")));
ben.iter(|| item!(fd!("[week_number repr:sunday]")));
ben.iter(|| item!(fd!("[week_number repr:monday]")));
ben.iter(|| item!(fd!("[year]")));
ben.iter(|| item!(fd!("[year base:iso_week]")));
ben.iter(|| item!(fd!("[year sign:mandatory]")));
ben.iter(|| item!(fd!("[year base:iso_week sign:mandatory]")));
ben.iter(|| item!(fd!("[year repr:last_two]")));
ben.iter(|| item!(fd!("[year base:iso_week repr:last_two]")));
}
fn display_date(ben: &mut Bencher<'_>) {
ben.iter(|| date!(2019-01-01).to_string());
ben.iter(|| date!(2019-12-31).to_string());
ben.iter(|| date!(-4713-11-24).to_string());
ben.iter(|| date!(-0001-01-01).to_string());
}
fn format_offset(ben: &mut Bencher<'_>) {
macro_rules! item {
($value:expr, $format:expr) => {
$value.format_into(&mut io::sink(), &$format)
}
}
ben.iter(|| item!(offset!(+01:02:03), fd!("[offset_hour sign:automatic]")));
ben.iter(|| item!(offset!(+01:02:03), fd!("[offset_hour sign:mandatory]")));
ben.iter(|| item!(offset!(-01:02:03), fd!("[offset_hour sign:automatic]")));
ben.iter(|| item!(offset!(-01:02:03), fd!("[offset_hour sign:mandatory]")));
ben.iter(|| item!(offset!(+01:02:03), fd!("[offset_minute]")));
ben.iter(|| item!(offset!(+01:02:03), fd!("[offset_second]")));
}
fn display_offset(ben: &mut Bencher<'_>) {
ben.iter(|| offset!(UTC).to_string());
ben.iter(|| offset!(+0:00:01).to_string());
ben.iter(|| offset!(-0:00:01).to_string());
ben.iter(|| offset!(+1).to_string());
ben.iter(|| offset!(-1).to_string());
ben.iter(|| offset!(+23:59).to_string());
ben.iter(|| offset!(-23:59).to_string());
ben.iter(|| offset!(+23:59:59).to_string());
ben.iter(|| offset!(-23:59:59).to_string());
}
fn format_pdt(ben: &mut Bencher<'_>) {
ben.iter(|| {
datetime!(1970-01-01 0:00).format_into(
&mut io::sink(),
fd!("[year]-[month]-[day] [hour]:[minute]:[second].[subsecond]"),
)
});
}
fn display_pdt(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(1970-01-01 0:00).to_string());
ben.iter(|| datetime!(1970-01-01 0:00:01).to_string());
}
fn format_odt(ben: &mut Bencher<'_>) {
let format_description = format_description::parse(
"[year]-[month]-[day] [hour]:[minute]:[second].[subsecond] [offset_hour \
sign:mandatory]:[offset_minute]:[offset_second]",
).expect("invalid format description");
ben.iter(|| {
datetime!(1970-01-01 0:00 UTC).format_into(&mut io::sink(), &format_description)
});
}
fn display_odt(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(1970-01-01 0:00 UTC).to_string());
}
}