Title: | Functions for Timing R Scripts, as Well as Implementations of "Stack" and "StackList" Structures |
---|---|
Description: | Code execution timing functions 'tic' and 'toc' that can be nested. One can record all timings while a complex script is running, and examine the values later. It is also possible to instrument the timing calls with custom callbacks. In addition, this package provides class 'Stack', implemented as a vector, and class 'StackList', which is a stack implemented as a list, both of which support operations 'push', 'pop', 'first_element', 'last_element' and 'clear'. |
Authors: | Sergei Izrailev |
Maintainer: | Sergei Izrailev <[email protected]> |
License: | Apache License (== 2.0) | file LICENSE |
Version: | 1.2.1 |
Built: | 2024-11-18 05:39:26 UTC |
Source: | https://github.com/jabiru/tictoc |
push
- Append an element.
pop
- Remove and return the last element.
clear
- Remove all elements.
shift
- Remove and return the first element.
first_element
- Return the first element. We can't use first
because
it's taken by the dplyr
package and is not an S3 method.
last_element
- Return the last element. We can't use last
because
it's taken by the dplyr
package and is not an S3 method.
size
- Return the number of elements.
as.Stack
- Creates a new Stack from (typically, vector) s
.
as.StackList
- Creates a new StackList from (typically, list) s
.
Stack()
- Creates and keeps a stack of items of the same type, implemented as an R vector.
The type is determined by the first push
operation.
StackList()
- Creates and keeps a list of items of the same type, implemented as an R list.
The type is determined by the first push
operation.
push(x, value) pop(x) clear(x) shift(x) first_element(x) last_element(x) size(x) as.Stack(s) as.StackList(s) Stack() StackList()
push(x, value) pop(x) clear(x) shift(x) first_element(x) last_element(x) size(x) as.Stack(s) as.StackList(s) Stack() StackList()
x |
A Stack or StackList object. |
value |
Value to append. |
s |
A structure to be converted to a Stack or StackList. |
tic
- Starts the timer and stores the start time and the message on the stack.
toc
- Notes the current timer and computes elapsed time since the matching call to tic()
.
When quiet
is FALSE
, prints the associated message and the elapsed time.
toc.outmsg
- Formats a message for pretty printing. Redefine this for different formatting.
tic.clearlog
- Clears the tic/toc log.
tic.clear
- Clears the tic/toc stack. This could be useful in cases when because of an error
the closing toc() calls never get executed.
tic.log
- Returns log messages from calls to tic/toc since the last call to tic.clearlog
.
tic(msg = NULL, quiet = TRUE, func.tic = NULL, ...) toc(log = FALSE, quiet = FALSE, func.toc = toc.outmsg, ...) toc.outmsg(tic, toc, msg) tic.clearlog() tic.clear() tic.log(format = TRUE)
tic(msg = NULL, quiet = TRUE, func.tic = NULL, ...) toc(log = FALSE, quiet = FALSE, func.toc = toc.outmsg, ...) toc.outmsg(tic, toc, msg) tic.clearlog() tic.clear() tic.log(format = TRUE)
msg |
- a text string associated with the timer. It gets printed on a call to |
quiet |
When |
func.tic |
Function producing the formatted message with a signature |
... |
The other parameters that are passed to |
log |
- When |
func.toc |
Function producing the formatted message with a signature |
tic |
Time from the call to tic() ( |
toc |
Time from the call to toc() ( |
format |
When true, |
tic
returns the timestamp (invisible).
toc
returns an (invisible) list containing the timestamps tic
, toc
, and the message msg
.
toc.outmsg
returns formatted message.
tic.log
returns a list of formatted messages (format = TRUE
) or a list
of lists containing the timestamps and unformatted messages from prior calls to tic/toc.
## Not run: ## Basic use case tic() print("Do something...") Sys.sleep(1) toc() # 1.034 sec elapsed ## Inline timing example, similar to system.time() tic(); for(i in 1:1000000) { j = i / 2 }; toc() # 0.527 sec elapsed ## Timing multiple steps tic("step 1") print("Do something...") Sys.sleep(1) toc() # step 1: 1.005 sec elapsed tic("step 2") print("Do something...") Sys.sleep(1) toc() # step 2: 1.004 sec elapsed ## Timing nested code tic("outer") Sys.sleep(1) tic("middle") Sys.sleep(2) tic("inner") Sys.sleep(3) toc() # inner: 3.004 sec elapsed toc() # middle: 5.008 sec elapsed toc() # outer: 6.016 sec elapsed ## Timing in a loop and analyzing the results later using tic.log(). tic.clearlog() for (x in 1:10) { tic(x) Sys.sleep(1) toc(log = TRUE, quiet = TRUE) } log.txt <- tic.log(format = TRUE) log.lst <- tic.log(format = FALSE) tic.clearlog() timings <- unlist(lapply(log.lst, function(x) x$toc - x$tic)) mean(timings) # [1] 1.001 writeLines(unlist(log.txt)) # 1: 1.002 sec elapsed # 2: 1 sec elapsed # 3: 1.002 sec elapsed # 4: 1.001 sec elapsed # 5: 1.001 sec elapsed # 6: 1.001 sec elapsed # 7: 1.001 sec elapsed # 8: 1.001 sec elapsed # 9: 1.001 sec elapsed # 10: 1 sec elapsed ## Using custom callbacks in tic/toc my.msg.tic <- function(tic, msg) { if (is.null(msg) || is.na(msg) || length(msg) == 0) { outmsg <- paste0(round(toc - tic, 3), " seconds elapsed") } else { outmsg <- paste0("Starting ", msg, "...") } outmsg } my.msg.toc <- function(tic, toc, msg, info) { if (is.null(msg) || is.na(msg) || length(msg) == 0) { outmsg <- paste0(round(toc - tic, 3), " seconds elapsed") } else { outmsg <- paste0(info, ": ", msg, ": ", round(toc - tic, 3), " seconds elapsed") } outmsg } tic("outer", quiet = FALSE, func.tic = my.msg.tic) # Starting outer... Sys.sleep(1) tic("middle", quiet = FALSE, func.tic = my.msg.tic) # Starting middle... Sys.sleep(2) tic("inner", quiet = FALSE, func.tic = my.msg.tic) Sys.sleep(3) # Starting inner... toc(quiet = FALSE, func.toc = my.msg.toc, info = "INFO") # INFO: inner: 3.005 seconds elapsed toc(quiet = FALSE, func.toc = my.msg.toc, info = "INFO") # INFO: middle: 5.01 seconds elapsed toc(quiet = FALSE, func.toc = my.msg.toc, info = "INFO") # INFO: outer: 6.014 seconds elapsed ## End(Not run)
## Not run: ## Basic use case tic() print("Do something...") Sys.sleep(1) toc() # 1.034 sec elapsed ## Inline timing example, similar to system.time() tic(); for(i in 1:1000000) { j = i / 2 }; toc() # 0.527 sec elapsed ## Timing multiple steps tic("step 1") print("Do something...") Sys.sleep(1) toc() # step 1: 1.005 sec elapsed tic("step 2") print("Do something...") Sys.sleep(1) toc() # step 2: 1.004 sec elapsed ## Timing nested code tic("outer") Sys.sleep(1) tic("middle") Sys.sleep(2) tic("inner") Sys.sleep(3) toc() # inner: 3.004 sec elapsed toc() # middle: 5.008 sec elapsed toc() # outer: 6.016 sec elapsed ## Timing in a loop and analyzing the results later using tic.log(). tic.clearlog() for (x in 1:10) { tic(x) Sys.sleep(1) toc(log = TRUE, quiet = TRUE) } log.txt <- tic.log(format = TRUE) log.lst <- tic.log(format = FALSE) tic.clearlog() timings <- unlist(lapply(log.lst, function(x) x$toc - x$tic)) mean(timings) # [1] 1.001 writeLines(unlist(log.txt)) # 1: 1.002 sec elapsed # 2: 1 sec elapsed # 3: 1.002 sec elapsed # 4: 1.001 sec elapsed # 5: 1.001 sec elapsed # 6: 1.001 sec elapsed # 7: 1.001 sec elapsed # 8: 1.001 sec elapsed # 9: 1.001 sec elapsed # 10: 1 sec elapsed ## Using custom callbacks in tic/toc my.msg.tic <- function(tic, msg) { if (is.null(msg) || is.na(msg) || length(msg) == 0) { outmsg <- paste0(round(toc - tic, 3), " seconds elapsed") } else { outmsg <- paste0("Starting ", msg, "...") } outmsg } my.msg.toc <- function(tic, toc, msg, info) { if (is.null(msg) || is.na(msg) || length(msg) == 0) { outmsg <- paste0(round(toc - tic, 3), " seconds elapsed") } else { outmsg <- paste0(info, ": ", msg, ": ", round(toc - tic, 3), " seconds elapsed") } outmsg } tic("outer", quiet = FALSE, func.tic = my.msg.tic) # Starting outer... Sys.sleep(1) tic("middle", quiet = FALSE, func.tic = my.msg.tic) # Starting middle... Sys.sleep(2) tic("inner", quiet = FALSE, func.tic = my.msg.tic) Sys.sleep(3) # Starting inner... toc(quiet = FALSE, func.toc = my.msg.toc, info = "INFO") # INFO: inner: 3.005 seconds elapsed toc(quiet = FALSE, func.toc = my.msg.toc, info = "INFO") # INFO: middle: 5.01 seconds elapsed toc(quiet = FALSE, func.toc = my.msg.toc, info = "INFO") # INFO: outer: 6.014 seconds elapsed ## End(Not run)
Functions for timing, as well as implementations of Stack and StackList structures.
The tictoc
package provides the timing functions tic
and
toc
that can be nested. It provides an alternative to
system.time()
with a different syntax similar to that in another
well-known software package. tic
and toc
are easy to use, and
are especially useful when timing several sections in more than a few lines
of code.
In general, calls to tic
and toc
start the timer when
the tic
call is made and stop the timer when the toc
call is
made, recording the elapsed time between the calls from proc.time
.
The default behavior is to print a simple message with the elapsed time in
the toc
call.
The features include the following:
nesting of the tic
and toc
calls
suppressing the default output with quiet = TRUE
collecting the timings in user-defined variables
collecting the timings in a log structure provided by the package
(see tic.log
)
providing a custom message for each tic
call
using custom callbacks for the tic
and toc
calls to redefine
the default behavior and/or add other functionality (such as logging to a database)
In addition, this package provides classes Stack
(implemented
as a vector
) and StackList
(a stack implemented as a list
),
both of which support operations push
, pop
, first_element
,
last_element
, clear
and size
.
Copyright (C) Collective, Inc.; with portions Copyright (C) Jabiru Ventures LLC
Apache License, Version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
http://github.com/jabiru/tictoc
devtools::install_github("jabiru/tictoc")
Sergei Izrailev