425 lines
16 KiB
Rust
425 lines
16 KiB
Rust
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));
|
|
}
|
|
}
|