package core:time
Index
Constants (25)
- ABSOLUTE_TO_INTERNAL
- ABSOLUTE_TO_UNIX
- ABSOLUTE_ZERO_YEAR
- DAYS_PER_100_YEARS
- DAYS_PER_400_YEARS
- DAYS_PER_4_YEARS
- Hour
- INTERNAL_TO_ABSOLUTE
- INTERNAL_TO_UNIX
- INTERNAL_TO_WALL
- IS_SUPPORTED
- MAX_DURATION
- MIN_DURATION
- Microsecond
- Millisecond
- Minute
- Nanosecond
- SECONDS_PER_DAY
- SECONDS_PER_HOUR
- SECONDS_PER_MINUTE
- SECONDS_PER_WEEK
- Second
- UNIX_TO_ABSOLUTE
- UNIX_TO_INTERNAL
- WALL_TO_INTERNAL
Variables (1)
Procedures (47)
- SCOPED_TICK_DURATION
- accurate_sleep
- benchmark
- clock_from_duration
- clock_from_seconds
- clock_from_stopwatch
- clock_from_time
- components_to_time
- compound_to_time
- date
- day
- diff
- duration_hours
- duration_microseconds
- duration_milliseconds
- duration_minutes
- duration_nanoseconds
- duration_round
- duration_seconds
- duration_truncate
- has_invariant_tsc
- is_leap_year
- month
- now
- read_cycle_counter
- rfc3339_to_components
- rfc3339_to_time_and_offset
- rfc3339_to_time_utc
- since
- sleep
- stopwatch_duration
- stopwatch_reset
- stopwatch_start
- stopwatch_stop
- tick_diff
- tick_lap_time
- tick_now
- tick_since
- time_add
- time_to_unix
- time_to_unix_nano
- to_unix_nanoseconds
- to_unix_seconds
- tsc_frequency
- unix
- weekday
- year
Procedure Groups (2)
Types
Benchmark_Error ¶
Benchmark_Error :: enum int { Okay = 0, Allocation_Error, }
Related Procedures With Returns
Benchmark_Options ¶
Benchmark_Options :: struct { setup: proc(options: ^Benchmark_Options, allocator := context.allocator) -> (err: Benchmark_Error), bench: proc(options: ^Benchmark_Options, allocator := context.allocator) -> (err: Benchmark_Error), teardown: proc(options: ^Benchmark_Options, allocator := context.allocator) -> (err: Benchmark_Error), rounds: int, bytes: int, input: []u8, count: int, processed: int, output: []u8, // Unused for hash benchmarks hash: u128, // Performance duration: Duration, rounds_per_second: f64, megabytes_per_second: f64, }
Related Procedures With Parameters
Duration ¶
Duration :: distinct i64
Related Procedures With Parameters
- SCOPED_TICK_DURATION
- accurate_sleep
- clock_from_duration
- duration_hours
- duration_microseconds
- duration_milliseconds
- duration_minutes
- duration_nanoseconds
- duration_round
- duration_seconds
- duration_truncate
- sleep
- time_add
- tsc_frequency
- clock (procedure groups)
Related Procedures With Returns
Related Constants
Month ¶
Month :: enum int { January = 1, February, March, April, May, June, July, August, September, October, November, December, }
Related Procedures With Returns
Stopwatch ¶
Related Procedures With Parameters
- clock_from_stopwatch
- stopwatch_duration
- stopwatch_reset
- stopwatch_start
- stopwatch_stop
- clock (procedure groups)
Tick ¶
Tick :: struct { _nsec: i64, }
Related Procedures With Parameters
Related Procedures With Returns
Time ¶
Time :: struct { _nsec: i64, }
Related Procedures With Parameters
- clock_from_time
- date
- day
- diff
- month
- since
- time_add
- time_to_unix
- time_to_unix_nano
- weekday
- year
- clock (procedure groups)
Related Procedures With Returns
Weekday ¶
Weekday :: enum int { Sunday = 0, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, }
Related Procedures With Returns
Constants
ABSOLUTE_TO_INTERNAL ¶
ABSOLUTE_TO_INTERNAL :: i64(-9223371966579724800)
i64((ABSOLUTE_ZERO_YEAR - 1) 365.2425 SECONDS_PER_DAY);
ABSOLUTE_TO_UNIX ¶
ABSOLUTE_TO_UNIX: i64 : -UNIX_TO_ABSOLUTE
ABSOLUTE_ZERO_YEAR ¶
ABSOLUTE_ZERO_YEAR :: i64(-292277022399)
Day is chosen so that 2001-01-01 is Monday in the calculations
DAYS_PER_100_YEARS ¶
DAYS_PER_100_YEARS :: 365 * 100 + 24
DAYS_PER_400_YEARS ¶
DAYS_PER_400_YEARS :: 365 * 400 + 97
DAYS_PER_4_YEARS ¶
DAYS_PER_4_YEARS :: 365 * 4 + 1
INTERNAL_TO_ABSOLUTE ¶
INTERNAL_TO_ABSOLUTE: i64 : -ABSOLUTE_TO_INTERNAL
INTERNAL_TO_UNIX ¶
INTERNAL_TO_UNIX: i64 : -UNIX_TO_INTERNAL
INTERNAL_TO_WALL ¶
INTERNAL_TO_WALL: i64 : -WALL_TO_INTERNAL
IS_SUPPORTED ¶
IS_SUPPORTED :: _IS_SUPPORTED
MAX_DURATION ¶
MAX_DURATION :: Duration(1 << 63 - 1)
MIN_DURATION ¶
MIN_DURATION :: Duration(-1 << 63)
Microsecond ¶
Microsecond: Duration : 1000 * Nanosecond
Millisecond ¶
Millisecond: Duration : 1000 * Microsecond
Nanosecond ¶
Nanosecond :: Duration(1)
SECONDS_PER_DAY ¶
SECONDS_PER_DAY :: 24 * SECONDS_PER_HOUR
SECONDS_PER_HOUR ¶
SECONDS_PER_HOUR :: 60 * SECONDS_PER_MINUTE
SECONDS_PER_MINUTE ¶
SECONDS_PER_MINUTE :: 60
SECONDS_PER_WEEK ¶
SECONDS_PER_WEEK :: 7 * SECONDS_PER_DAY
UNIX_TO_ABSOLUTE ¶
UNIX_TO_ABSOLUTE: i64 : UNIX_TO_INTERNAL + INTERNAL_TO_ABSOLUTE
UNIX_TO_INTERNAL ¶
UNIX_TO_INTERNAL :: i64((1969 * 365 + 1969 / 4 - 1969 / 100 + 1969 / 400) * SECONDS_PER_DAY)
WALL_TO_INTERNAL ¶
WALL_TO_INTERNAL :: i64((1884 * 365 + 1884 / 4 - 1884 / 100 + 1884 / 400) * SECONDS_PER_DAY)
Variables
days_before ¶
days_before: [13]i32 = …
Procedures
accurate_sleep ¶
accurate_sleep :: proc "contextless" (d: Duration) {…}
Accurate sleep borrowed from: https://blat-blatnik.github.io/computerBear/making-accurate-sleep-function/
Accuracy seems to be pretty good out of the box on Linux, to within around 4µs worst case.
On Windows it depends but is comparable with regular sleep in the worst case.
To get the same kind of accuracy as on Linux, have your program call windows.timeBeginPeriod(1)
to
tell Windows to use a more accurate timer for your process.
Additionally your program should call windows.timeEndPeriod(1)
once you're done with accurate_sleep
.
benchmark ¶
benchmark :: proc(options: ^Benchmark_Options, allocator := context.allocator) -> (err: Benchmark_Error) {…}
has_invariant_tsc ¶
has_invariant_tsc :: proc "contextless" () -> bool {…}
read_cycle_counter ¶
read_cycle_counter :: proc "contextless" () -> u64 {…}
rfc3339_to_components ¶
rfc3339_to_components :: proc(rfc_datetime: string) -> (res: datetime.DateTime, utc_offset: int, is_leap: bool, consumed: int) {…}
Parses an RFC 3339 string and returns Time and a UTC offset in minutes. e.g. 1985-04-12T23:20:50.52Z Performs no validation on whether components are valid, e.g. it'll return hour = 25 if that's what it's given
rfc3339_to_time_and_offset ¶
rfc3339_to_time_and_offset :: proc(rfc_datetime: string, is_leap: ^bool = nil) -> (res: Time, utc_offset: int, consumed: int) {…}
Parses an RFC 3339 string and returns Time and a UTC offset in minutes.
e.g. 1985-04-12T23:20:50.52Z
Note: Only 4-digit years are accepted.
Optional pointer to boolean is_leap
will return true
if the moment was a leap second.
Leap seconds are smeared into 23:59:59.
rfc3339_to_time_utc ¶
rfc3339_to_time_utc :: proc(rfc_datetime: string, is_leap: ^bool = nil) -> (res: Time, consumed: int) {…}
Parses an RFC 3339 string and returns Time in UTC, with any UTC offset applied to it.
Only 4-digit years are accepted.
Optional pointer to boolean is_leap
will return true
if the moment was a leap second.
Leap seconds are smeared into 23:59:59.
stopwatch_reset ¶
stopwatch_reset :: proc "contextless" (stopwatch: ^Stopwatch) {…}
stopwatch_start ¶
stopwatch_start :: proc "contextless" (stopwatch: ^Stopwatch) {…}
stopwatch_stop ¶
stopwatch_stop :: proc "contextless" (stopwatch: ^Stopwatch) {…}
tick_now ¶
tick_now :: proc "contextless" () -> Tick {…}
to_unix_nanoseconds ¶
to_unix_nanoseconds :: time_to_unix_nano
to_unix_seconds ¶
to_unix_seconds :: time_to_unix
Procedure Groups
clock ¶
clock :: proc{ clock_from_time, clock_from_duration, clock_from_stopwatch, }
datetime_to_time ¶
datetime_to_time :: proc{ components_to_time, compound_to_time, }
Source Files
- perf.odin
- rfc3339.odin
- time.odin
- (hidden platform specific files)
Generation Information
Generated with odin version dev-2024-04 (vendor "odin") Windows_amd64 @ 2024-04-26 21:08:59.123591300 +0000 UTC