Skip to main content

get-internal-real-time

get-internal-real-time Function

Syntax:

get-internal-real-time ⟨no arguments⟩ → internal-time

Arguments and Values:

internal-time—a non-negative integer .

Description:

get-internal-real-time returns as an integer the current time in internal time units, relative to an arbitrary time base. The difference between the values of two calls to this function is the amount of elapsed real time (i.e., clock time) between the two calls.

Affected By:

Time of day (i.e., the passage of time). The time base affects the result magnitude.

See Also:

internal-time-units-per-second

Expanded Reference: get-internal-real-time

Measuring elapsed wall-clock time

get-internal-real-time returns the current time in internal time units. The difference between two calls measures elapsed wall-clock time.

(let ((start (get-internal-real-time)))
(sleep 0.1)
(let ((elapsed (- (get-internal-real-time) start)))
(> elapsed 0)))
=> T

Converting to seconds

Divide by internal-time-units-per-second to convert to seconds.

(let ((start (get-internal-real-time)))
(sleep 0.5)
(let ((elapsed (- (get-internal-real-time) start)))
(> (float (/ elapsed internal-time-units-per-second)) 0.4)))
;; => T

Higher resolution than universal time

Unlike get-universal-time which has one-second resolution, get-internal-real-time typically has sub-second resolution.

(> internal-time-units-per-second 1)
=> T

;; Can measure sub-second intervals
(let ((start (get-internal-real-time)))
(loop for i from 1 to 10000 sum i)
(let ((elapsed (- (get-internal-real-time) start)))
(>= elapsed 0)))
=> T

Benchmarking with get-internal-real-time

A common pattern for benchmarking code.

(defun benchmark (fn &optional (iterations 1000))
(let ((start (get-internal-real-time)))
(dotimes (i iterations) (funcall fn))
(float (/ (- (get-internal-real-time) start)
internal-time-units-per-second))))

(numberp (benchmark (lambda () (make-list 100)) 10000))
;; => T