Revision control

Copy as Markdown

Other Tools

use std::hint::black_box;
use std::time::SystemTime;
use criterion::Bencher;
use time::ext::{NumericalDuration, NumericalStdDuration};
use time::macros::{date, datetime, offset, time};
use time::OffsetDateTime;
setup_benchmark! {
"OffsetDateTime",
fn now_utc(ben: &mut Bencher<'_>) {
ben.iter(OffsetDateTime::now_utc);
}
fn now_local(ben: &mut Bencher<'_>) {
ben.iter(OffsetDateTime::now_local);
}
fn to_offset(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2000-01-01 0:00 +11).to_offset(offset!(-5)));
ben.iter(|| datetime!(2000-01-01 0:00 +11).to_offset(offset!(-8)));
}
fn to_utc(ben: &mut Bencher<'_>) {
ben.iter(|| black_box(datetime!(2000-01-01 0:00 +11).to_utc()));
}
fn from_unix_timestamp(ben: &mut Bencher<'_>) {
ben.iter(|| OffsetDateTime::from_unix_timestamp(0));
ben.iter(|| OffsetDateTime::from_unix_timestamp(1_546_300_800));
}
fn from_unix_timestamp_nanos(ben: &mut Bencher<'_>) {
ben.iter(|| OffsetDateTime::from_unix_timestamp_nanos(0));
ben.iter(|| OffsetDateTime::from_unix_timestamp_nanos(1_546_300_800_000_000_000));
}
fn offset(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC).offset());
ben.iter(|| datetime!(2019-01-01 0:00 +1).offset());
ben.iter(|| datetime!(2019-01-01 1:00 +1).offset());
}
fn unix_timestamp(ben: &mut Bencher<'_>) {
ben.iter(|| OffsetDateTime::UNIX_EPOCH.unix_timestamp());
ben.iter(|| datetime!(1970-01-01 1:00 +1).unix_timestamp());
ben.iter(|| datetime!(1970-01-01 0:00 -1).unix_timestamp());
}
fn unix_timestamp_nanos(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(1970-01-01 0:00 UTC).unix_timestamp_nanos());
ben.iter(|| datetime!(1970-01-01 1:00 +1).unix_timestamp_nanos());
ben.iter(|| datetime!(1970-01-01 0:00 -1).unix_timestamp_nanos());
}
fn date(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC).date());
ben.iter(|| datetime!(2018-12-31 23:00 -1).date());
}
fn time(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC).time());
ben.iter(|| datetime!(2018-12-31 23:00 -1).time());
}
fn year(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC).year());
ben.iter(|| datetime!(2018-12-31 23:00 -1).year());
}
fn ordinal(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC).ordinal());
ben.iter(|| datetime!(2018-12-31 23:00 -1).ordinal());
}
fn hour(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC).hour());
ben.iter(|| datetime!(2018-12-31 23:00 -1).hour());
}
fn minute(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC).minute());
ben.iter(|| datetime!(2018-12-31 23:00 -1).minute());
}
fn second(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC).second());
ben.iter(|| datetime!(2018-12-31 23:00 -1).second());
}
fn replace_time(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2020-01-01 5:00 UTC).replace_time(time!(12:00)));
ben.iter(|| datetime!(2020-01-01 12:00 -5).replace_time(time!(7:00)));
ben.iter(|| datetime!(2020-01-01 0:00 +1).replace_time(time!(12:00)));
}
fn replace_date(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2020-01-01 12:00 UTC).replace_date(date!(2020-01-30)));
ben.iter(|| datetime!(2020-01-01 0:00 +1).replace_date(date!(2020-01-30)));
}
fn replace_date_time(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2020-01-01 12:00 UTC).replace_date_time(datetime!(2020-01-30 16:00)));
ben.iter(|| datetime!(2020-01-01 12:00 +1).replace_date_time(datetime!(2020-01-30 0:00)));
}
fn replace_offset(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2020-01-01 0:00 UTC).replace_offset(offset!(-5)));
}
fn partial_eq(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(1999-12-31 23:00 -1) == datetime!(2000-01-01 0:00 UTC));
}
fn partial_ord(ben: &mut Bencher<'_>) {
ben.iter(||
datetime!(2019-01-01 0:00 UTC).partial_cmp(&datetime!(1999-12-31 23:00 -1))
);
}
fn ord(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-01 0:00 UTC) == datetime!(2018-12-31 23:00 -1));
ben.iter(|| datetime!(2019-01-01 0:00:00.000_000_001 UTC) > datetime!(2019-01-01 0:00 UTC));
}
fn hash(ben: &mut Bencher<'_>) {
use std::collections::hash_map::DefaultHasher;
use std::hash::Hash;
iter_batched_ref!(
ben,
DefaultHasher::new,
[
|hasher| datetime!(2019-01-01 0:00 UTC).hash(hasher),
|hasher| datetime!(2018-12-31 23:00 -1).hash(hasher),
]
);
}
fn add_duration(ben: &mut Bencher<'_>) {
let a = 5.days();
let b = 1.days();
let c = 2.seconds();
let d = (-2).seconds();
let e = 1.hours();
ben.iter(|| datetime!(2019-01-01 0:00 UTC) + a);
ben.iter(|| datetime!(2019-12-31 0:00 UTC) + b);
ben.iter(|| datetime!(2019-12-31 23:59:59 UTC) + c);
ben.iter(|| datetime!(2020-01-01 0:00:01 UTC) + d);
ben.iter(|| datetime!(1999-12-31 23:00 UTC) + e);
}
fn add_std_duration(ben: &mut Bencher<'_>) {
let a = 5.std_days();
let b = 1.std_days();
let c = 2.std_seconds();
ben.iter(|| datetime!(2019-01-01 0:00 UTC) + a);
ben.iter(|| datetime!(2019-12-31 0:00 UTC) + b);
ben.iter(|| datetime!(2019-12-31 23:59:59 UTC) + c);
}
fn add_assign_duration(ben: &mut Bencher<'_>) {
let a = 1.days();
let b = 1.seconds();
iter_batched_ref!(
ben,
|| datetime!(2019-01-01 0:00 UTC),
[
|datetime| *datetime += a,
|datetime| *datetime += b,
]
);
}
fn add_assign_std_duration(ben: &mut Bencher<'_>) {
let a = 1.std_days();
let b = 1.std_seconds();
iter_batched_ref!(
ben,
|| datetime!(2019-01-01 0:00 UTC),
[
|datetime| *datetime += a,
|datetime| *datetime += b,
]
);
}
fn sub_duration(ben: &mut Bencher<'_>) {
let a = 5.days();
let b = 1.days();
let c = 2.seconds();
ben.iter(|| datetime!(2019-01-06 0:00 UTC) - a);
ben.iter(|| datetime!(2020-01-01 0:00 UTC) - b);
ben.iter(|| datetime!(2020-01-01 0:00:01 UTC) - c);
}
fn sub_std_duration(ben: &mut Bencher<'_>) {
let a = 5.std_days();
let b = 1.std_days();
let c = 2.std_seconds();
ben.iter(|| datetime!(2019-01-06 0:00 UTC) - a);
ben.iter(|| datetime!(2020-01-01 0:00 UTC) - b);
ben.iter(|| datetime!(2020-01-01 0:00:01 UTC) - c);
}
fn sub_assign_duration(ben: &mut Bencher<'_>) {
let a = 1.days();
let b = 1.seconds();
iter_batched_ref!(
ben,
|| datetime!(2019-01-01 0:00 UTC),
[
|datetime| *datetime -= a,
|datetime| *datetime -= b,
]
);
}
fn sub_assign_std_duration(ben: &mut Bencher<'_>) {
let a = 1.std_days();
let b = 1.std_seconds();
iter_batched_ref!(
ben,
|| datetime!(2019-01-01 0:00 UTC),
[
|datetime| *datetime -= a,
|datetime| *datetime -= b,
]
);
}
fn std_add_duration(ben: &mut Bencher<'_>) {
let a1 = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let a2 = 0.seconds();
let b1 = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let b2 = 5.days();
let c1 = SystemTime::from(datetime!(2019-12-31 0:00 UTC));
let c2 = 1.days();
let d1 = SystemTime::from(datetime!(2019-12-31 23:59:59 UTC));
let d2 = 2.seconds();
let e1 = SystemTime::from(datetime!(2020-01-01 0:00:01 UTC));
let e2 = (-2).seconds();
ben.iter(|| a1 + a2);
ben.iter(|| b1 + b2);
ben.iter(|| c1 + c2);
ben.iter(|| d1 + d2);
ben.iter(|| e1 + e2);
}
fn std_add_assign_duration(ben: &mut Bencher<'_>) {
let a = 1.days();
let b = 1.seconds();
iter_batched_ref!(
ben,
|| SystemTime::from(datetime!(2019-01-01 0:00 UTC)),
[
|datetime| *datetime += a,
|datetime| *datetime += b,
]
);
}
fn std_sub_duration(ben: &mut Bencher<'_>) {
let a1 = SystemTime::from(datetime!(2019-01-06 0:00 UTC));
let a2 = 5.days();
let b1 = SystemTime::from(datetime!(2020-01-01 0:00 UTC));
let b2 = 1.days();
let c1 = SystemTime::from(datetime!(2020-01-01 0:00:01 UTC));
let c2 = 2.seconds();
let d1 = SystemTime::from(datetime!(2019-12-31 23:59:59 UTC));
let d2 = (-2).seconds();
ben.iter(|| a1 - a2);
ben.iter(|| b1 - b2);
ben.iter(|| c1 - c2);
ben.iter(|| d1 - d2);
}
fn std_sub_assign_duration(ben: &mut Bencher<'_>) {
let a = 1.days();
let b = 1.seconds();
iter_batched_ref!(
ben,
|| SystemTime::from(datetime!(2019-01-01 0:00 UTC)),
[
|datetime| *datetime -= a,
|datetime| *datetime -= b,
]
);
}
fn sub_self(ben: &mut Bencher<'_>) {
ben.iter(|| datetime!(2019-01-02 0:00 UTC) - datetime!(2019-01-01 0:00 UTC));
ben.iter(|| datetime!(2019-01-01 0:00 UTC) - datetime!(2019-01-02 0:00 UTC));
ben.iter(|| datetime!(2020-01-01 0:00 UTC) - datetime!(2019-12-31 0:00 UTC));
ben.iter(|| datetime!(2019-12-31 0:00 UTC) - datetime!(2020-01-01 0:00 UTC));
}
fn std_sub(ben: &mut Bencher<'_>) {
let a = SystemTime::from(datetime!(2019-01-02 0:00 UTC));
let b = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let c = SystemTime::from(datetime!(2020-01-01 0:00 UTC));
let d = SystemTime::from(datetime!(2019-12-31 0:00 UTC));
ben.iter(|| a - datetime!(2019-01-01 0:00 UTC));
ben.iter(|| b - datetime!(2019-01-02 0:00 UTC));
ben.iter(|| c - datetime!(2019-12-31 0:00 UTC));
ben.iter(|| d - datetime!(2020-01-01 0:00 UTC));
}
fn sub_std(ben: &mut Bencher<'_>) {
let a = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let b = SystemTime::from(datetime!(2019-01-02 0:00 UTC));
let c = SystemTime::from(datetime!(2019-12-31 0:00 UTC));
let d = SystemTime::from(datetime!(2020-01-01 0:00 UTC));
ben.iter(|| datetime!(2019-01-02 0:00 UTC) - a);
ben.iter(|| datetime!(2019-01-01 0:00 UTC) - b);
ben.iter(|| datetime!(2020-01-01 0:00 UTC) - c);
ben.iter(|| datetime!(2019-12-31 0:00 UTC) - d);
}
fn eq_std(ben: &mut Bencher<'_>) {
let a = OffsetDateTime::now_utc();
let b = SystemTime::from(a);
ben.iter(|| a == b);
}
fn std_eq(ben: &mut Bencher<'_>) {
let a = OffsetDateTime::now_utc();
let b = SystemTime::from(a);
ben.iter(|| b == a);
}
fn ord_std(ben: &mut Bencher<'_>) {
let a = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let b = SystemTime::from(datetime!(2020-01-01 0:00 UTC));
let c = SystemTime::from(datetime!(2019-02-01 0:00 UTC));
let d = SystemTime::from(datetime!(2019-01-02 0:00 UTC));
let e = SystemTime::from(datetime!(2019-01-01 1:00:00 UTC));
let f = SystemTime::from(datetime!(2019-01-01 0:01:00 UTC));
let g = SystemTime::from(datetime!(2019-01-01 0:00:01 UTC));
let h = SystemTime::from(datetime!(2019-01-01 0:00:00.001 UTC));
let i = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let j = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let k = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let l = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let m = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let n = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let o = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
ben.iter(|| datetime!(2019-01-01 0:00 UTC) == a);
ben.iter(|| datetime!(2019-01-01 0:00 UTC) < b);
ben.iter(|| datetime!(2019-01-01 0:00 UTC) < c);
ben.iter(|| datetime!(2019-01-01 0:00 UTC) < d);
ben.iter(|| datetime!(2019-01-01 0:00 UTC) < e);
ben.iter(|| datetime!(2019-01-01 0:00 UTC) < f);
ben.iter(|| datetime!(2019-01-01 0:00 UTC) < g);
ben.iter(|| datetime!(2019-01-01 0:00 UTC) < h);
ben.iter(|| datetime!(2020-01-01 0:00 UTC) > i);
ben.iter(|| datetime!(2019-02-01 0:00 UTC) > j);
ben.iter(|| datetime!(2019-01-02 0:00 UTC) > k);
ben.iter(|| datetime!(2019-01-01 1:00:00 UTC) > l);
ben.iter(|| datetime!(2019-01-01 0:01:00 UTC) > m);
ben.iter(|| datetime!(2019-01-01 0:00:01 UTC) > n);
ben.iter(|| datetime!(2019-01-01 0:00:00.000_000_001 UTC) > o);
}
fn std_ord(ben: &mut Bencher<'_>) {
let a = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let b = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let c = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let d = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let e = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let f = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let g = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let h = SystemTime::from(datetime!(2019-01-01 0:00 UTC));
let i = SystemTime::from(datetime!(2020-01-01 0:00 UTC));
let j = SystemTime::from(datetime!(2019-02-01 0:00 UTC));
let k = SystemTime::from(datetime!(2019-01-02 0:00 UTC));
let l = SystemTime::from(datetime!(2019-01-01 1:00:00 UTC));
let m = SystemTime::from(datetime!(2019-01-01 0:01:00 UTC));
let n = SystemTime::from(datetime!(2019-01-01 0:00:01 UTC));
let o = SystemTime::from(datetime!(2019-01-01 0:00:00.001 UTC));
ben.iter(|| a == datetime!(2019-01-01 0:00 UTC));
ben.iter(|| b < datetime!(2020-01-01 0:00 UTC));
ben.iter(|| c < datetime!(2019-02-01 0:00 UTC));
ben.iter(|| d < datetime!(2019-01-02 0:00 UTC));
ben.iter(|| e < datetime!(2019-01-01 1:00:00 UTC));
ben.iter(|| f < datetime!(2019-01-01 0:01:00 UTC));
ben.iter(|| g < datetime!(2019-01-01 0:00:01 UTC));
ben.iter(|| h < datetime!(2019-01-01 0:00:00.000_000_001 UTC));
ben.iter(|| i > datetime!(2019-01-01 0:00 UTC));
ben.iter(|| j > datetime!(2019-01-01 0:00 UTC));
ben.iter(|| k > datetime!(2019-01-01 0:00 UTC));
ben.iter(|| l > datetime!(2019-01-01 0:00 UTC));
ben.iter(|| m > datetime!(2019-01-01 0:00 UTC));
ben.iter(|| n > datetime!(2019-01-01 0:00 UTC));
ben.iter(|| o > datetime!(2019-01-01 0:00 UTC));
}
fn from_std(ben: &mut Bencher<'_>) {
let a = SystemTime::UNIX_EPOCH;
let b = SystemTime::UNIX_EPOCH - 1.std_days();
let c = SystemTime::UNIX_EPOCH + 1.std_days();
ben.iter(|| OffsetDateTime::from(a));
ben.iter(|| OffsetDateTime::from(b));
ben.iter(|| OffsetDateTime::from(c));
}
fn to_std(ben: &mut Bencher<'_>) {
let a = OffsetDateTime::UNIX_EPOCH;
let b = OffsetDateTime::UNIX_EPOCH + 1.days();
let c = OffsetDateTime::UNIX_EPOCH - 1.days();
ben.iter(|| SystemTime::from(a));
ben.iter(|| SystemTime::from(b));
ben.iter(|| SystemTime::from(c));
}
}