You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.1 KiB
Lua
86 lines
2.1 KiB
Lua
3 years ago
|
--[=[
|
||
|
@c Stopwatch
|
||
|
@t ui
|
||
|
@mt mem
|
||
|
@d Used to measure an elapsed period of time. If a truthy value is passed as an
|
||
|
argument, then the stopwatch will initialize in an idle state; otherwise, it will
|
||
|
initialize in an active state. Although nanosecond precision is available, Lua
|
||
|
can only reliably provide microsecond accuracy due to the lack of native 64-bit
|
||
|
integer support. Generally, milliseconds should be sufficient here.
|
||
|
]=]
|
||
|
|
||
|
local hrtime = require('uv').hrtime
|
||
|
local constants = require('constants')
|
||
|
local Time = require('utils/Time')
|
||
|
|
||
|
local format = string.format
|
||
|
|
||
|
local MS_PER_NS = 1 / (constants.NS_PER_US * constants.US_PER_MS)
|
||
|
|
||
|
local Stopwatch, get = require('class')('Stopwatch')
|
||
|
|
||
|
function Stopwatch:__init(stopped)
|
||
|
local t = hrtime()
|
||
|
self._initial = t
|
||
|
self._final = stopped and t or nil
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m __tostring
|
||
|
@r string
|
||
|
@d Defines the behavior of the `tostring` function. Returns a string that
|
||
|
represents the elapsed milliseconds for convenience of introspection.
|
||
|
]=]
|
||
|
function Stopwatch:__tostring()
|
||
|
return format('Stopwatch: %s ms', self.milliseconds)
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m stop
|
||
|
@r nil
|
||
|
@d Effectively stops the stopwatch.
|
||
|
]=]
|
||
|
function Stopwatch:stop()
|
||
|
if self._final then return end
|
||
|
self._final = hrtime()
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m start
|
||
|
@r nil
|
||
|
@d Effectively starts the stopwatch.
|
||
|
]=]
|
||
|
function Stopwatch:start()
|
||
|
if not self._final then return end
|
||
|
self._initial = self._initial + hrtime() - self._final
|
||
|
self._final = nil
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m reset
|
||
|
@r nil
|
||
|
@d Effectively resets the stopwatch.
|
||
|
]=]
|
||
|
function Stopwatch:reset()
|
||
|
self._initial = self._final or hrtime()
|
||
|
end
|
||
|
|
||
|
--[=[
|
||
|
@m getTime
|
||
|
@r Time
|
||
|
@d Returns a new Time object that represents the currently elapsed time. This is
|
||
|
useful for "catching" the current time and comparing its many forms as required.
|
||
|
]=]
|
||
|
function Stopwatch:getTime()
|
||
|
return Time(self.milliseconds)
|
||
|
end
|
||
|
|
||
|
--[=[@p milliseconds number The total number of elapsed milliseconds. If the
|
||
|
stopwatch is running, this will naturally be different each time that it is accessed.]=]
|
||
|
function get.milliseconds(self)
|
||
|
local ns = (self._final or hrtime()) - self._initial
|
||
|
return ns * MS_PER_NS
|
||
|
end
|
||
|
|
||
|
return Stopwatch
|