From d80edf2edad09066bc79e1541ab7ef590ce125b6 Mon Sep 17 00:00:00 2001 From: tison Date: Mon, 12 Aug 2024 22:01:46 +0800 Subject: [PATCH] refactor: rework as fastant Signed-off-by: tison --- .github/workflows/ci.yml | 48 +++++++++++++------------- Cargo.toml | 21 ++++++------ README.md | 48 ++++++++------------------ benches/criterion.rs | 20 +++++------ benchmark.jpeg | Bin 123794 -> 0 bytes rustfmt.toml | 12 +++++++ src/instant.rs | 72 ++++++++++++++++++++++----------------- src/lib.rs | 52 ++++++++++++++-------------- src/tsc_now.rs | 3 +- 9 files changed, 141 insertions(+), 135 deletions(-) delete mode 100644 benchmark.jpeg create mode 100644 rustfmt.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b3c8dd4..952d0ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [ master ] + branches: [ main ] pull_request: - branches: [ master ] + branches: [ main ] env: CARGO_TERM_COLOR: always @@ -14,36 +14,36 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [macos-latest, ubuntu-latest, windows-latest] - features: ["atomic", "atomic,fallback-coarse"] - rust: [stable] + os: [ macos-latest, ubuntu-latest, windows-latest ] + features: [ "atomic", "atomic,fallback-coarse" ] + rust: [ stable ] env: RUST_BACKTRACE: 1 steps: - - uses: actions/checkout@v2 - - name: Set up toolchains - uses: actions-rs/toolchain@v1 - with: + - uses: actions/checkout@v4 + - uses: Swatinem/rust-cache@v2 + - name: Set up toolchains + uses: dtolnay/rust-toolchain@master + with: toolchain: ${{ matrix.rust }} - override: true components: rustfmt, clippy - - name: Check format - run: cargo fmt --all -- --check - - name: Build - run: cargo build --workspace --all-targets --features ${{ matrix.features }} - - name: Clippy - run: cargo clippy --workspace --all-targets --features ${{ matrix.features }} -- -D warnings - - name: Run tests - run: cargo test --workspace --all-targets --features ${{ matrix.features }} -- --nocapture - - name: Run benches - run: cargo bench --workspace --all-targets --features ${{ matrix.features }} + - name: Check format + run: cargo fmt --all -- --check + - name: Build + run: cargo build --workspace --all-targets --features ${{ matrix.features }} + - name: Clippy + run: cargo clippy --workspace --all-targets --features ${{ matrix.features }} -- -D warnings + - name: Run tests + run: cargo test --workspace --all-targets --features ${{ matrix.features }} -- --nocapture + - name: Run benches + run: cargo bench --workspace --all-targets --features ${{ matrix.features }} build-wasm: runs-on: ubuntu-latest env: RUST_BACKTRACE: 1 steps: - - uses: actions/checkout@v2 - - name: Set up toolchains - run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - - run: wasm-pack test --node + - uses: actions/checkout@v4 + - name: Set up toolchains + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + - run: wasm-pack test --node diff --git a/Cargo.toml b/Cargo.toml index 15f900e..e3dd0ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,21 +1,22 @@ [package] -name = "minstant" -version = "0.1.7" -authors = ["The TiKV Authors"] +name = "fastant" +version = "0.1.0" +authors = ["FastLabs Developers"] edition = "2021" license = "MIT" -description = "A drop-in replacement for `std::time::Instant` that measures time with high performance and high accuracy powered by TSC" -homepage = "https://github.com/tikv/minstant" -repository = "https://github.com/tikv/minstant" -documentation = "https://docs.rs/minstant" +description = "A drop-in replacement for `std::time::Instant` that measures time with high performance and high accuracy powered by Time Stamp Counter (TSC)." +homepage = "https://github.com/fast/fastant" +repository = "https://github.com/fast/fastant" +documentation = "https://docs.rs/fastant" readme = "README.md" keywords = ["TSC", "clock", "rdtsc", "timing", "nanosecond"] + [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] -ctor = "0.1.20" +ctor = "0.2" coarsetime = { version = "0.1", optional = true } web-time = "1.0" @@ -24,8 +25,8 @@ atomic = [] fallback-coarse = ["coarsetime"] [dev-dependencies] -criterion = "0.3" -quanta = "0.9" +criterion = "0.5" +quanta = "0.12" rand = "0.8" wasm-bindgen-test = "0.3" getrandom = { version = "0.2", features = ["js"] } diff --git a/README.md b/README.md index 32cb727..53bf950 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,37 @@ -# minstant -[![Actions Status](https://github.com/tikv/minstant/workflows/CI/badge.svg)](https://github.com/tikv/minstant/actions) -[![Build Status](https://travis-ci.org/tikv/minstant.svg?branch=master)](https://travis-ci.org/tikv/minstant) -[![Documentation](https://docs.rs/minstant/badge.svg)](https://docs.rs/minstant/) -[![Crates.io](https://img.shields.io/crates/v/minstant.svg)](https://crates.io/crates/minstant) -[![LICENSE](https://img.shields.io/github/license/tikv/minstant.svg)](https://github.com/tikv/minstant/blob/master/LICENSE) +# Fastant -A drop-in replacement for [`std::time::Instant`](https://doc.rust-lang.org/std/time/struct.Instant.html) that measures time with high performance and high accuracy powered by [TSC](https://en.wikipedia.org/wiki/Time_Stamp_Counter). +A drop-in replacement for [`std::time::Instant`](https://doc.rust-lang.org/std/time/struct.Instant.html) that measures time with high performance and high accuracy powered by [Time Stamp Counter (TSC)](https://en.wikipedia.org/wiki/Time_Stamp_Counter). + +[![Actions Status](https://github.com/fast/fastant/workflows/CI/badge.svg)](https://github.com/fast/fastant/actions) +[![Documentation](https://docs.rs/fastant/badge.svg)](https://docs.rs/fastant/) +[![Crates.io](https://img.shields.io/crates/v/fastant.svg)](https://crates.io/crates/fastant) +[![LICENSE](https://img.shields.io/github/license/fast/fastant.svg)](LICENSE) ## Usage ```toml [dependencies] -minstant = "0.1" +fastant = "0.1" ``` ```rust -let start = minstant::Instant::now(); - -// Code snipppet to measure - -let duration: std::time::Duration = start.elapsed(); +fn main() { + let start = fastant::Instant::now(); + let duration: std::time::Duration = start.elapsed(); +} ``` - ## Motivation -This library is used by a high performance tracing library [`minitrace-rust`](https://github.com/tikv/minitrace-rust). The main purpose is to use [TSC](https://en.wikipedia.org/wiki/Time_Stamp_Counter) on x86 processors to measure time at high speed without losing much accuracy. +This library is used by a high performance tracing library [`fastrace`](https://github.com/fast/fastrace). The main purpose is to use [Time Stamp Counter (TSC)](https://en.wikipedia.org/wiki/Time_Stamp_Counter) on x86 processors to measure time at high speed without losing much accuracy. ## Platform Support -Currently, only the Linux on `x86` or `x86_64` is backed by [TSC](https://en.wikipedia.org/wiki/Time_Stamp_Counter). On other platforms, `minstant` falls back to `std::time`. If TSC is unstable, it will also fall back to `std::time`. +Currently, only the Linux on `x86` or `x86_64` is backed by Time Stamp Counter (TSC). On other platforms, Fastant falls back to `std::time`. If TSC is unstable, it will also fall back to `std::time`. If speed is privileged over accuracy when fallback occurs, you can use `fallback-coarse` feature to use coarse time: ```toml [dependencies] -minstant = { version = "0.1", features = ["fallback-coarse"] } -``` - -## Benchmark - -Benchmark platform is `Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz` on CentOS 7. - -```sh -> cargo criterion - -Instant::now()/minstant time: [10.449 ns 10.514 ns 10.619 ns] -Instant::now()/quanta time: [31.467 ns 31.628 ns 31.822 ns] -Instant::now()/std time: [26.831 ns 26.924 ns 27.016 ns] -minstant::Anchor::new() time: [46.987 ns 47.243 ns 47.498 ns] -minstant::Instant::as_unix_nanos() time: [15.287 ns 15.318 ns 15.350 ns] +fastant = { version = "0.1", features = ["fallback-coarse"] } ``` - -![Benchmark](benchmark.jpeg) diff --git a/benches/criterion.rs b/benches/criterion.rs index 4ef925c..8195424 100644 --- a/benches/criterion.rs +++ b/benches/criterion.rs @@ -1,12 +1,12 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; -fn bench_nows(c: &mut Criterion) { - // The first call will take some time for calibartion +fn bench_now(c: &mut Criterion) { + // The first call will take some time for calibration quanta::Instant::now(); let mut group = c.benchmark_group("Instant::now()"); - group.bench_function("minstant", |b| { - b.iter(minstant::Instant::now); + group.bench_function("fastant", |b| { + b.iter(fastant::Instant::now); }); group.bench_function("quanta", |b| { b.iter(quanta::Instant::now); @@ -18,19 +18,19 @@ fn bench_nows(c: &mut Criterion) { } fn bench_anchor_new(c: &mut Criterion) { - c.bench_function("minstant::Anchor::new()", |b| { - b.iter(minstant::Anchor::new); + c.bench_function("fastant::Anchor::new()", |b| { + b.iter(fastant::Anchor::new); }); } fn bench_as_unix_nanos(c: &mut Criterion) { - let anchor = minstant::Anchor::new(); - c.bench_function("minstant::Instant::as_unix_nanos()", |b| { + let anchor = fastant::Anchor::new(); + c.bench_function("fastant::Instant::as_unix_nanos()", |b| { b.iter(|| { - black_box(minstant::Instant::now().as_unix_nanos(&anchor)); + black_box(fastant::Instant::now().as_unix_nanos(&anchor)); }); }); } -criterion_group!(benches, bench_nows, bench_anchor_new, bench_as_unix_nanos); +criterion_group!(benches, bench_now, bench_anchor_new, bench_as_unix_nanos); criterion_main!(benches); diff --git a/benchmark.jpeg b/benchmark.jpeg deleted file mode 100644 index ac6297e28ad81de209649241c1eb9d124a100f79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123794 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

ZgbB!B;j=uS>Nkyxs`7wX##X2Gd)e)b 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 LM&Ry~UkCmRCnTWC diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..f73a725 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,12 @@ +comment_width = 120 +edition = "2021" +format_code_in_doc_comments = true +group_imports = "StdExternalCrate" +imports_granularity = "Item" +normalize_comments = true +overflow_delimited_expr = true +reorder_imports = true +trailing_comma = "Vertical" +version = "Two" +where_single_line = true +wrap_comments = true diff --git a/src/instant.rs b/src/instant.rs index 03e3099..da0daa0 100644 --- a/src/instant.rs +++ b/src/instant.rs @@ -1,12 +1,15 @@ // Copyright 2021 TiKV Project Authors. Licensed under Apache-2.0. -use std::{ - ops::{Add, AddAssign, Sub, SubAssign}, - time::Duration, -}; -use web_time::{SystemTime, UNIX_EPOCH}; +use std::ops::Add; +use std::ops::AddAssign; +use std::ops::Sub; +use std::ops::SubAssign; +use std::time::Duration; -/// A measurement of a monotonically nondecreasing clock. Similar to +use web_time::SystemTime; +use web_time::UNIX_EPOCH; + +/// A measurement of a monotonically non-decreasing clock. Similar to /// [`std::time::Instant`](std::time::Instant) but is faster and more /// accurate if TSC is available. #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -22,9 +25,8 @@ impl Instant { /// /// # Examples /// - /// ``` - /// use minstant::Instant; - /// + /// ```rust + /// use fastant::Instant; /// let now = Instant::now(); /// ``` pub fn now() -> Instant { @@ -36,20 +38,21 @@ impl Instant { /// /// # Panics /// - /// Previously we panicked if `earlier` was later than `self`. Currently this method saturates + /// Previously we panicked if `earlier` was later than `self`. Currently, this method saturates /// to follow the behavior of the standard library. Future versions may reintroduce the panic /// in some circumstances. /// /// # Examples /// /// ``` - /// use std::time::Duration; /// use std::thread::sleep; + /// use std::time::Duration; /// - /// use minstant::Instant; + /// use fastant::Instant; /// /// let now = Instant::now(); /// sleep(Duration::new(1, 0)); + /// /// let new_now = Instant::now(); /// println!("{:?}", new_now.duration_since(now)); /// println!("{:?}", now.duration_since(new_now)); // 0ns @@ -64,13 +67,14 @@ impl Instant { /// # Examples /// /// ``` - /// use std::time::Duration; /// use std::thread::sleep; + /// use std::time::Duration; /// - /// use minstant::Instant; + /// use fastant::Instant; /// /// let now = Instant::now(); /// sleep(Duration::new(1, 0)); + /// /// let new_now = Instant::now(); /// println!("{:?}", new_now.checked_duration_since(now)); /// println!("{:?}", now.checked_duration_since(new_now)); // None @@ -87,13 +91,14 @@ impl Instant { /// # Examples /// /// ``` - /// use std::time::Duration; /// use std::thread::sleep; + /// use std::time::Duration; /// - /// use minstant::Instant; + /// use fastant::Instant; /// /// let now = Instant::now(); /// sleep(Duration::new(1, 0)); + /// /// let new_now = Instant::now(); /// println!("{:?}", new_now.saturating_duration_since(now)); /// println!("{:?}", now.saturating_duration_since(new_now)); // 0ns @@ -113,10 +118,10 @@ impl Instant { /// # Examples /// /// ``` - /// use std::time::Duration; /// use std::thread::sleep; + /// use std::time::Duration; /// - /// use minstant::Instant; + /// use fastant::Instant; /// /// let instant = Instant::now(); /// let three_secs = Duration::from_secs(3); @@ -146,18 +151,20 @@ impl Instant { .map(Instant) } - /// Convert interal clocking counter into a UNIX timestamp represented as the - /// nanoseconds elapsed from [UNIX_EPOCH](std::time::UNIX_EPOCH). + /// Convert internal clocking counter into a UNIX timestamp represented as the + /// nanoseconds elapsed from [UNIX_EPOCH](UNIX_EPOCH). /// - /// [`Anchor`](crate::Anchor) contains the necessary calibration data for conversion. - /// Typically, initializing an [`Anchor`](crate::Anchor) takes about 50 nano seconds, so + /// [`Anchor`](Anchor) contains the necessary calibration data for conversion. + /// Typically, initializing an [`Anchor`](Anchor) takes about 50 nanoseconds, so /// try to reuse it for a batch of `Instant`. /// /// # Examples /// /// ``` /// use std::time::UNIX_EPOCH; - /// use minstant::{Instant, Anchor}; + /// + /// use fastant::Anchor; + /// use fastant::Instant; /// /// let anchor = Anchor::new(); /// let instant = Instant::now(); @@ -214,7 +221,7 @@ impl Sub for Instant { /// /// # Panics /// - /// Previously we panicked if `other` was later than `self`. Currently this method saturates + /// Previously we panicked if `other` was later than `self`. Currently, this method saturates /// to follow the behavior of the standard library. Future versions may reintroduce the panic /// in some circumstances. fn sub(self, other: Instant) -> Duration { @@ -230,7 +237,7 @@ impl std::fmt::Debug for Instant { /// An anchor which can be used to convert internal clocking counter into system timestamp. /// -/// *[See also the `Instant::as_unix_nanos()`](crate::Instant::as_unix_nanos).* +/// **[See also the `Instant::as_unix_nanos()`](Instant::as_unix_nanos).** #[derive(Copy, Clone)] pub struct Anchor { unix_time_ns: u64, @@ -260,11 +267,14 @@ impl Anchor { #[cfg(all(feature = "atomic", target_has_atomic = "64"))] #[cfg_attr(docsrs, doc(cfg(all(feature = "atomic", target_has_atomic = "64"))))] mod atomic { - use super::Instant; - use std::sync::atomic::{AtomicU64, Ordering}; + use std::sync::atomic::AtomicU64; + use std::sync::atomic::Ordering; + #[cfg(doc)] use Ordering::*; + use super::Instant; + /// Atomic variant of [`Instant`]. #[derive(Debug)] #[repr(transparent)] @@ -320,8 +330,8 @@ mod atomic { /// Loads a value from the [`Atomic`]. /// - /// `load` takes an [`Ordering`] argument which describes the memory ordering of this operation. - /// Possible values are [`SeqCst`], [`Acquire`] and [`Relaxed`]. + /// `load` takes an [`Ordering`] argument which describes the memory ordering of this + /// operation. Possible values are [`SeqCst`], [`Acquire`] and [`Relaxed`]. /// /// # Panics /// @@ -339,8 +349,8 @@ mod atomic { /// Stores a value into the [`Atomic`]. /// - /// `store` takes an [`Ordering`] argument which describes the memory ordering of this operation. - /// Possible values are [`SeqCst`], [`Release`] and [`Relaxed`]. + /// `store` takes an [`Ordering`] argument which describes the memory ordering of this + /// operation. Possible values are [`SeqCst`], [`Release`] and [`Relaxed`]. /// /// # Panics /// diff --git a/src/lib.rs b/src/lib.rs index f34d8ea..baade1a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,49 +1,46 @@ // Copyright 2021 TiKV Project Authors. Licensed under Apache-2.0. //! A drop-in replacement for [`std::time::Instant`](https://doc.rust-lang.org/std/time/struct.Instant.html) -//! that measures time with high performance and high accuracy powered by [TSC](https://en.wikipedia.org/wiki/Time_Stamp_Counter). +//! that measures time with high performance and high accuracy powered by [Time Stamp Counter (TSC)](https://en.wikipedia.org/wiki/Time_Stamp_Counter). //! //! ## Example //! -//! ``` -//! let start = minstant::Instant::now(); -//! -//! // Code snipppet to measure -//! +//! ```rust +//! let start = fastant::Instant::now(); //! let duration: std::time::Duration = start.elapsed(); //! ``` //! //! ## Platform Support //! -//! Currently, only the Linux on `x86` or `x86_64` is backed by [TSC](https://en.wikipedia.org/wiki/Time_Stamp_Counter). -//! On other platforms, `minstant` falls back to coarse time. +//! Currently, only the Linux on `x86` or `x86_64` is backed by Time Stamp Counter (TSC). +//! On other platforms, `fastant` falls back to coarse time. //! //! ## Calibration //! -//! [TSC](https://en.wikipedia.org/wiki/Time_Stamp_Counter) doesn’t necessarily ticks in constant speed and even -//! doesn't synchronize across CPU cores. The calibration detects the TSC deviation and calculates the correction -//! factors with the assistance of a source wall clock. Once the deviation is beyond a crazy threshold, the calibration -//! will fail, and then we will fall back to coarse time. +//! Time Stamp Counter (TSC) doesn't necessarily tick in constant speed and even doesn't synchronize +//! across CPU cores. The calibration detects the TSC deviation and calculates the correction +//! factors with the assistance of a source wall clock. Once the deviation is beyond a crazy +//! threshold, the calibration will fail, and then we will fall back to coarse time. //! -//! This calibration is stored globally and reused. In order to start the calibration before any call to `minstant` -//! as to make sure that the time spent on `minstant` is constant, we link the calibration into application's -//! initialization linker section, so it'll get executed once the process starts. +//! This calibration is stored globally and reused. In order to start the calibration before any +//! call to `fastant` as to make sure that the time spent on `fastant` is constant, we link the +//! calibration into application's initialization linker section, so it'll get executed once the +//! process starts. //! -//! *[See also the `Instant` type](crate::Instant).* - -#![cfg_attr(docsrs, feature(doc_cfg))] +//! **[See also the `Instant` type](Instant).** mod instant; #[cfg(all(target_os = "linux", any(target_arch = "x86", target_arch = "x86_64")))] mod tsc_now; +pub use instant::Anchor; #[cfg(all(feature = "atomic", target_has_atomic = "64"))] #[cfg_attr(docsrs, doc(cfg(all(feature = "atomic", target_has_atomic = "64"))))] pub use instant::Atomic; -pub use instant::{Anchor, Instant}; +pub use instant::Instant; -/// Return `true` if the current platform supports [TSC](https://en.wikipedia.org/wiki/Time_Stamp_Counter), -/// and the calibration has succeed. +/// Return `true` if the current platform supports Time Stamp Counter (TSC), +/// and the calibration has succeeded. /// /// The result is always the same during the lifetime of the application process. #[inline] @@ -102,11 +99,14 @@ pub(crate) fn nanos_per_cycle() -> f64 { #[cfg(test)] mod tests { - use super::*; + use std::time::Duration; + use std::time::Instant as StdInstant; + use rand::Rng; - use std::time::{Duration, Instant as StdInstant}; use wasm_bindgen_test::wasm_bindgen_test; + use super::*; + #[test] #[wasm_bindgen_test] fn test_is_tsc_available() { @@ -147,7 +147,7 @@ mod tests { let std_instant = StdInstant::now(); std::thread::sleep(Duration::from_millis(rng.gen_range(100..500))); let check = move || { - let duration_ns_minstant = instant.elapsed(); + let duration_ns_fastant = instant.elapsed(); let duration_ns_std = std_instant.elapsed(); #[cfg(target_os = "windows")] @@ -156,7 +156,7 @@ mod tests { let expect_max_delta_ns = 5_000_000; let real_delta = (duration_ns_std.as_nanos() as i128 - - duration_ns_minstant.as_nanos() as i128) + - duration_ns_fastant.as_nanos() as i128) .abs(); assert!( real_delta < expect_max_delta_ns, @@ -165,7 +165,7 @@ mod tests { ); }; check(); - std::thread::spawn(check).join().expect("join failed"); + std::thread::spawn(check).join().expect("failed to join thread"); } } } diff --git a/src/tsc_now.rs b/src/tsc_now.rs index c811d02..220c82d 100644 --- a/src/tsc_now.rs +++ b/src/tsc_now.rs @@ -2,8 +2,9 @@ //! This module will be compiled when it's either linux_x86 or linux_x86_64. +use std::cell::UnsafeCell; +use std::fs::read_to_string; use std::time::Instant; -use std::{cell::UnsafeCell, fs::read_to_string}; static TSC_STATE: TSCState = TSCState { is_tsc_available: UnsafeCell::new(false),