blob: 87b2f196c0d32e4afd27e8fcce06733bf5a21664 [file] [log] [blame]
# File src/library/tools/R/Rprof.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2017 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
.Rprof <- function(args = NULL, no.q = FALSE)
{
do_exit <-
if(no.q)
function(status) (if(status) stop else message)(
".Rprof() exit status ", status)
else
function(status) q("no", status = status, runLast = FALSE)
Usage <- function() {
cat("Usage: R CMD Rprof [options] [file]",
"",
"Post-process profiling information in file generated by Rprof().",
"",
"Options:",
" -h, --help print short help message and exit",
" -v, --version print version info and exit",
" --lines print line information",
" --total print only by total",
" --self print only by self",
" --linesonly print only by line (implies --lines)",
" --min%total= minimum % to print for 'by total'",
" --min%self= minimum % to print for 'by self'",
"",
"If 'file' is omitted 'Rprof.out' is used",
"",
"Report bugs at <https://bugs.R-project.org>.", sep = "\n")
}
if (is.null(args)) {
args <- commandArgs(TRUE)
## it seems that splits on spaces, so try harder.
args <- paste(args, collapse=" ")
args <- strsplit(args,'nextArg', fixed = TRUE)[[1L]][-1L]
}
files <- character()
bytotal <- byself <- bylines <- TRUE
lines <- FALSE
mintotal <- minself <- -1L
while(length(args)) {
a <- args[1L]
if (a %in% c("-h", "--help")) {
Usage()
do_exit(0L)
}
else if (a %in% c("-v", "--version")) {
cat("R profiling post-processor: ",
R.version[["major"]], ".", R.version[["minor"]],
" (r", R.version[["svn rev"]], ")\n", sep = "")
cat("",
"Copyright (C) 1997-2014 The R Core Team.",
"This is free software; see the GNU General Public License version 2",
"or later for copying conditions. There is NO warranty.",
sep = "\n")
do_exit(0L)
} else if (a == "--total") {
bytotal <- TRUE
byself <- FALSE
bylines <- FALSE
} else if (a == "--self") {
bytotal <- FALSE
byself <- TRUE
bylines <- FALSE
} else if (a == "--linesonly") {
lines <- TRUE
byself <- FALSE
bytotal <- FALSE
bylines <- TRUE
} else if (a == "--lines") {
lines <- TRUE
} else if (substr(a, 1, 12) == "--min%total=") {
mintotal <- as.integer(substr(a, 13, 1000))
} else if (substr(a, 1, 11) == "--min%self=") {
minself <- as.integer(substr(a, 12, 1000))
} else files <- c(files, a)
args <- args[-1L]
}
file <- if (!length(files)) "Rprof.out" else files[1L]
res <- utils::summaryRprof(file, lines = if (lines) "show" else "hide")
cat("\nEach sample represents", format(res$sample.interval), "seconds.\n")
cat("Total run time:", format(res$sampling.time), "seconds.\n")
cat("\nTotal seconds: time spent in function and callees.\n")
cat("Self seconds: time spent in function alone.\n\n")
printed <- FALSE
if (bytotal) {
m <- data.frame(res$by.total[c(2,1,4,3)], row.names(res$by.total))
if(mintotal > 0) m <- m[m[,1L] >= mintotal,,drop = FALSE]
writeLines(c(" % total % self",
" total seconds self seconds name",
sprintf("%6.1f%10.2f%10.1f%10.2f %s",
m[,1L], m[,2L], m[,3L], m[,4L], m[,5L])))
printed <- TRUE
}
if(byself) {
if (printed) cat("\n\n")
m <- data.frame(res$by.self[c(2,1,4,3)], row.names(res$by.self))
if(minself > 0) m <- m[m[,1L] >= minself,,drop = FALSE]
writeLines(c(" % self % total",
" self seconds total seconds name",
sprintf("%6.1f%10.2f%10.1f%10.2f %s",
m[,1L], m[,2L], m[,3L], m[,4L], m[,5L])))
printed <- TRUE
}
if(lines && bylines) {
if (printed) cat("\n\n")
m <- data.frame(res$by.line[c(2,1,4,3)], row.names(res$by.line))
if(minself > 0) m <- m[m[,1L] >= minself,,drop = FALSE]
if(mintotal > 0) m <- m[m[,1L] >= mintotal,,drop = FALSE]
writeLines(c(" % self % total",
" self seconds total seconds name",
sprintf("%6.1f%10.2f%10.1f%10.2f %s",
m[,1L], m[,2L], m[,3L], m[,4L], m[,5L])))
}
do_exit(0L)
}