272 lines
7.8 KiB
Rust
272 lines
7.8 KiB
Rust
|
|
use std::hint::black_box;
|
||
|
|
|
||
|
|
use criterion::Bencher;
|
||
|
|
use time::ext::{NumericalDuration, NumericalStdDuration};
|
||
|
|
use time::macros::time;
|
||
|
|
use time::Time;
|
||
|
|
|
||
|
|
setup_benchmark! {
|
||
|
|
"Time",
|
||
|
|
|
||
|
|
fn from_hms(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::from_hms(1, 2, 3));
|
||
|
|
}
|
||
|
|
|
||
|
|
fn from_hms_milli(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::from_hms_milli(1, 2, 3, 4));
|
||
|
|
}
|
||
|
|
|
||
|
|
fn from_hms_micro(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::from_hms_micro(1, 2, 3, 4));
|
||
|
|
}
|
||
|
|
|
||
|
|
fn from_hms_nano(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::from_hms_nano(1, 2, 3, 4));
|
||
|
|
}
|
||
|
|
|
||
|
|
fn as_hms(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.as_hms());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn as_hms_milli(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.as_hms_milli());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn as_hms_micro(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.as_hms_micro());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn as_hms_nano(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.as_hms_nano());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn hour(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.hour());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn minute(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.minute());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn second(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.second());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn millisecond(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.millisecond());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn microsecond(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.microsecond());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn nanosecond(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT.nanosecond());
|
||
|
|
}
|
||
|
|
|
||
|
|
fn add_duration(ben: &mut Bencher<'_>) {
|
||
|
|
let a = 1.milliseconds();
|
||
|
|
let b = 1.seconds();
|
||
|
|
let c = 1.minutes();
|
||
|
|
let d = 1.hours();
|
||
|
|
let e = 1.days();
|
||
|
|
ben.iter(|| Time::MIDNIGHT + a);
|
||
|
|
ben.iter(|| Time::MIDNIGHT + b);
|
||
|
|
ben.iter(|| Time::MIDNIGHT + c);
|
||
|
|
ben.iter(|| Time::MIDNIGHT + d);
|
||
|
|
ben.iter(|| Time::MIDNIGHT + e);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn add_assign_duration(ben: &mut Bencher<'_>) {
|
||
|
|
let a = 1.milliseconds();
|
||
|
|
let b = 1.seconds();
|
||
|
|
let c = 1.minutes();
|
||
|
|
let d = 1.hours();
|
||
|
|
let e = 1.days();
|
||
|
|
iter_batched_ref!(
|
||
|
|
ben,
|
||
|
|
|| Time::MIDNIGHT,
|
||
|
|
[
|
||
|
|
|time| *time += a,
|
||
|
|
|time| *time += b,
|
||
|
|
|time| *time += c,
|
||
|
|
|time| *time += d,
|
||
|
|
|time| *time += e,
|
||
|
|
]
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn sub_duration(ben: &mut Bencher<'_>) {
|
||
|
|
let a = 1.milliseconds();
|
||
|
|
let b = 1.seconds();
|
||
|
|
let c = 1.minutes();
|
||
|
|
let d = 1.hours();
|
||
|
|
let e = 1.days();
|
||
|
|
ben.iter(|| Time::MIDNIGHT - a);
|
||
|
|
ben.iter(|| Time::MIDNIGHT - b);
|
||
|
|
ben.iter(|| Time::MIDNIGHT - c);
|
||
|
|
ben.iter(|| Time::MIDNIGHT - d);
|
||
|
|
ben.iter(|| Time::MIDNIGHT - e);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn sub_assign_duration(ben: &mut Bencher<'_>) {
|
||
|
|
let a = 1.milliseconds();
|
||
|
|
let b = 1.seconds();
|
||
|
|
let c = 1.minutes();
|
||
|
|
let d = 1.hours();
|
||
|
|
let e = 1.days();
|
||
|
|
iter_batched_ref!(
|
||
|
|
ben,
|
||
|
|
|| Time::MIDNIGHT,
|
||
|
|
[
|
||
|
|
|time| *time -= a,
|
||
|
|
|time| *time -= b,
|
||
|
|
|time| *time -= c,
|
||
|
|
|time| *time -= d,
|
||
|
|
|time| *time -= e,
|
||
|
|
]
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn add_std_duration(ben: &mut Bencher<'_>) {
|
||
|
|
let a = 1.std_milliseconds();
|
||
|
|
let b = 1.std_seconds();
|
||
|
|
let c = 1.std_minutes();
|
||
|
|
let d = 1.std_hours();
|
||
|
|
let e = 1.std_days();
|
||
|
|
ben.iter(|| Time::MIDNIGHT + a);
|
||
|
|
ben.iter(|| Time::MIDNIGHT + b);
|
||
|
|
ben.iter(|| Time::MIDNIGHT + c);
|
||
|
|
ben.iter(|| Time::MIDNIGHT + d);
|
||
|
|
ben.iter(|| Time::MIDNIGHT + e);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn add_assign_std_duration(ben: &mut Bencher<'_>) {
|
||
|
|
let a = 1.std_milliseconds();
|
||
|
|
let b = 1.std_seconds();
|
||
|
|
let c = 1.std_minutes();
|
||
|
|
let d = 1.std_hours();
|
||
|
|
let e = 1.std_days();
|
||
|
|
iter_batched_ref!(
|
||
|
|
ben,
|
||
|
|
|| Time::MIDNIGHT,
|
||
|
|
[
|
||
|
|
|time| *time += a,
|
||
|
|
|time| *time += b,
|
||
|
|
|time| *time += c,
|
||
|
|
|time| *time += d,
|
||
|
|
|time| *time += e,
|
||
|
|
]
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn sub_std_duration(ben: &mut Bencher<'_>) {
|
||
|
|
let a = 1.std_milliseconds();
|
||
|
|
let b = 1.std_seconds();
|
||
|
|
let c = 1.std_minutes();
|
||
|
|
let d = 1.std_hours();
|
||
|
|
let e = 1.std_days();
|
||
|
|
ben.iter(|| Time::MIDNIGHT - a);
|
||
|
|
ben.iter(|| Time::MIDNIGHT - b);
|
||
|
|
ben.iter(|| Time::MIDNIGHT - c);
|
||
|
|
ben.iter(|| Time::MIDNIGHT - d);
|
||
|
|
ben.iter(|| Time::MIDNIGHT - e);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn sub_assign_std_duration(ben: &mut Bencher<'_>) {
|
||
|
|
let a = 1.std_milliseconds();
|
||
|
|
let b = 1.std_seconds();
|
||
|
|
let c = 1.std_minutes();
|
||
|
|
let d = 1.std_hours();
|
||
|
|
let e = 1.std_days();
|
||
|
|
iter_batched_ref!(
|
||
|
|
ben,
|
||
|
|
|| Time::MIDNIGHT,
|
||
|
|
[
|
||
|
|
|time| *time -= a,
|
||
|
|
|time| *time -= b,
|
||
|
|
|time| *time -= c,
|
||
|
|
|time| *time -= d,
|
||
|
|
|time| *time -= e,
|
||
|
|
]
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn sub_time(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT - time!(0:00:01));
|
||
|
|
ben.iter(|| time!(1:00) - Time::MIDNIGHT);
|
||
|
|
ben.iter(|| time!(1:00) - time!(0:00:01));
|
||
|
|
}
|
||
|
|
|
||
|
|
fn ordering(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter(|| Time::MIDNIGHT < time!(0:00:00.000_000_001));
|
||
|
|
ben.iter(|| Time::MIDNIGHT < time!(0:00:01));
|
||
|
|
ben.iter(|| time!(12:00) > time!(11:00));
|
||
|
|
ben.iter(|| Time::MIDNIGHT == time!(0:00:00.000_000_001));
|
||
|
|
}
|
||
|
|
|
||
|
|
fn sort_align_8(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter_batched_ref(
|
||
|
|
|| {
|
||
|
|
#[repr(C,align(8))]
|
||
|
|
struct Padder {
|
||
|
|
arr: [Time;4096],
|
||
|
|
}
|
||
|
|
let mut res = Padder {
|
||
|
|
arr: [Time::MIDNIGHT;4096]
|
||
|
|
};
|
||
|
|
let mut last = Time::MIDNIGHT;
|
||
|
|
let mut last_hour = 0;
|
||
|
|
for t in &mut res.arr {
|
||
|
|
*t = last;
|
||
|
|
t.replace_hour(last_hour).expect("failed to replace hour");
|
||
|
|
last += 997.std_milliseconds();
|
||
|
|
last_hour = (last_hour + 5) % 24;
|
||
|
|
}
|
||
|
|
res.arr.sort_unstable_by_key(|t|
|
||
|
|
(t.nanosecond(),t.second(),t.minute(),t.hour())
|
||
|
|
);
|
||
|
|
res
|
||
|
|
},
|
||
|
|
|v| black_box(v).arr.sort_unstable(),
|
||
|
|
criterion::BatchSize::SmallInput
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
fn sort_align_4(ben: &mut Bencher<'_>) {
|
||
|
|
ben.iter_batched_ref(
|
||
|
|
|| {
|
||
|
|
#[repr(C,align(8))]
|
||
|
|
struct Padder {
|
||
|
|
pad: u32,
|
||
|
|
arr: [Time;4096],
|
||
|
|
}
|
||
|
|
let mut res = Padder {
|
||
|
|
pad: 0,
|
||
|
|
arr: [Time::MIDNIGHT;4096]
|
||
|
|
};
|
||
|
|
let mut last = Time::MIDNIGHT;
|
||
|
|
let mut last_hour = 0;
|
||
|
|
for t in &mut res.arr {
|
||
|
|
*t = last;
|
||
|
|
t.replace_hour(last_hour).expect("failed to replace hour");
|
||
|
|
last += 997.std_milliseconds();
|
||
|
|
last_hour = (last_hour + 5) % 24;
|
||
|
|
}
|
||
|
|
res.arr.sort_unstable_by_key(|t|
|
||
|
|
(t.nanosecond(),t.second(),t.minute(),t.hour())
|
||
|
|
);
|
||
|
|
res
|
||
|
|
},
|
||
|
|
|v| black_box(v).arr.sort_unstable(),
|
||
|
|
criterion::BatchSize::SmallInput
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
fn duration_until(ben: &mut Bencher<'_>) {
|
||
|
|
let a = black_box(time!(1:02:03.004_005_006));
|
||
|
|
let b = black_box(time!(4:05:06.007_008_009));
|
||
|
|
ben.iter(|| black_box(a.duration_until(b)));
|
||
|
|
}
|
||
|
|
}
|