當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R Rprof 啟用 R 執行分析


R語言 Rprof 位於 utils 包(package)。

說明

啟用或禁用執行分析R表達式。

用法

Rprof(filename = "Rprof.out", append = FALSE, interval = 0.02,
       memory.profiling = FALSE, gc.profiling = FALSE,
       line.profiling = FALSE, filter.callframes = FALSE,
       numfiles = 100L, bufsize = 10000L,
       event = c("default", "cpu", "elapsed"))

參數

filename

用於記錄分析結果的文件。設置為 NULL"" 以禁用分析。

append

邏輯:文件應該是over-written還是附加到?

interval

real:樣本之間的距離(時間間隔),以秒為單位。

memory.profiling

邏輯:將內存使用信息寫入文件?

gc.profiling

邏輯:記錄GC是否正在運行?

line.profiling

邏輯:將行位置寫入文件?

filter.callframes

邏輯:過濾掉調用樹的幹擾調用幀。請參閱過濾調用幀部分。

numfiles , bufsize

整數:行分析內存分配

event

字符:分析事件,長度為 1 的字符向量,"elapsed" 表示經過的時間(實際,wall-clock),"cpu" 表示 CPU 時間,均以秒為單位。 "default" 是平台上的默認事件,兩者之一。請參閱“詳細信息”。

細節

自動啟用分析會禁用對另一個或同一文件的任何現有分析。

分析的工作原理是每隔 interval 秒(分析事件的單位)將調用堆棧寫入指定的文件。 summaryRprof 函數或包裝腳本 R CMD Rprof 可用於處理輸出文件以生成使用情況摘要;使用 R CMD Rprof --help 獲取使用信息。

確切測量的內容很微妙,並且取決於分析事件。

"elapsed"(Windows 上默認且唯一受支持的事件):是時候了R進程正在運行並執行R命令。然而,這不僅僅是 CPU 時間,因為如果readline()正在等待輸入,這也很重要。它也稱為‘elapsed’ 時間。

"cpu"(Unix 上的默認值,通常是識別性能瓶頸的首選事件),它是R過程,因此例如排除時間R正在等待輸入或運行的進程system返回。它可能會慢於"elapsed"當進程經常等待 I/O 完成時,但在多核係統上主動計算並發線程(例如通過 OpenMP)可能會更快。

注意(定時)間隔不能太小。對於 "cpu" ,每個分析步驟所花費的時間當前已添加到間隔中。對於所有分析事件,每個分析步驟中的計算都會對觀察到的係統造成擾動並使結果產生偏差。可行的是machine-dependent。在 Linux 上,R 要求間隔至少為 10 毫秒,在所有其他平台上至少為 1 毫秒。較短的間隔將被四舍五入並帶有警告。

"default" 分析事件在 Windows 上為 "elapsed",在 Unix 上為 "cpu"

支持"elapsed"Unix 上的事件是新的並且被認為是實驗性的。為了降低丟失樣本的風險,R 嘗試使用(實時)FIFO 調度策略,並為啟動每個樣本收集的內部線程提供最大調度優先級。如果設置該優先級失敗,則嘗試使用當前調度策略的最大調度優先級,回退到當前調度參數。在 Linux 上,普通用戶通常不允許使用實時調度優先級。這通常可以通過 PAM 允許(例如‘/etc/security/limits.conf’),有關詳細信息,請參閱操作係統文檔。僅當分析高負載下的係統時,優先級才重要。

僅當函數在調用堆棧上放置上下文時,函數才會記錄在配置文件日誌中(請參閱 sys.calls )。某些 primitive 函數不會這樣做:特別是 type "special" 的函數(有關更多詳細信息,請參閱“R 內部”手冊)。

如果 line.profilingTRUE ,並且正在執行的代碼是使用源引用進行解析的,則各個語句將記錄在配置文件日誌中。有關源參考的討論,請參閱parse。默認情況下,語句位置不會顯示在 summaryRprof 中,但請參閱幫助頁麵以獲取啟用顯示的選項。

過濾掉調用幀

延遲求值使調用堆棧變得更加複雜,因為在將參數應用於函數的時間和有效求值它們的時間之間創建了中間調用幀。當調用堆棧表示為樹時,這些中間幀顯示為同級節點。例如,在計算 EXPR 時,計算 try(EXPR) 會生成以下調用樹:

1. +-base::try(EXPR)
2. | \-base::tryCatch(...)
3. |   \-base:::tryCatchList(expr, classes, parentenv, handlers)
4. |     \-base:::tryCatchOne(expr, names, parentenv, handlers[[1L]])
5. |       \-base:::doTryCatch(return(expr), name, parentenv, handler)
6. \-EXPR

第 2 行到第 5 行是幹預調用幀,最後一個調用幀最終觸發了 EXPR 的求值。將 filter.callframes 設置為 TRUE 可通過刪除介入幀的所有同級節點來簡化探查器輸出。

eval() 幀應用了相同類型的調用幀過濾。當您調用 eval() 時,會將兩個幀壓入堆棧以確保幀之間的連續性。假設我們有這些定義:

calling <- function() evaluator(quote(called()), environment())
evaluator <- function(expr, env) eval(expr, env)
called <- function() EXPR()

calling() 通過 eval() 在自己的環境中調用 called() 。後者通過 evaluator() 間接調用。此代碼的最終效果與直接調用 called() 相同,無需中介。然而,完整的調用堆棧如下所示:

1. calling()
2. \-evaluator(quote(called()), environment())
3.   \-base::eval(expr, env)
4.     \-base::eval(expr, env)
5.       \-called()
6.         \-EXPR()

當調用幀過濾打開時,會查找called()的真實調用環境,過濾後的調用堆棧如下所示:

1. calling()
5. \-called()
6.   \-EXPR()

如果調用環境不在堆棧上,則eval()調用的函數成為根節點。假設我們有:

calling <- function() evaluator(quote(called()), new.env())

通過調用幀過濾,我們得到以下過濾後的調用堆棧:

5. called()
6. \-EXPR()

注意

在 Unix 類係統上:

分析並非在所有平台上都可用。默認情況下,如果可能的話,會編譯對分析的支持 - 配置R--disable-R-profiling改變這一點。

作為RCPU 分析使用與 C 分析相同的機製,兩者不能一起使用,因此不要使用Rprof(event = "cpu")(默認)在為 C-level 分析構建的可執行文件中(例如使用 GCC 選項-p或者-pg)。

在 Windows 上:

filename 可以是無法轉換為當前區域設置的 UTF-8 編碼文件路徑。

探查器會異步中斷 R,並且它無法在運行時分配內存來存儲結果。這會影響行分析,它需要存儲未知數量的文件路徑名。 numfilesbufsize 參數控製預分配緩衝區的大小以保存這些結果:前者計算路徑的最大數量,後者計算路徑中的字節數。如果分析器用完空間,它將跳過記錄新文件的行信息,並在調用 Rprof(NULL) 完成分析時發出警告。

例子

## Not run: Rprof()
## some code to be profiled
Rprof(NULL)
## some code NOT to be profiled
Rprof(append = TRUE)
## some code to be profiled
Rprof(NULL)
## ...
## Now post-process the output as described in Details

## End(Not run)

也可以看看

“編寫 R 擴展”中的“整理和分析 R 代碼”一章(請參閱“文檔/手冊’的子目錄R源樹)。

summaryRprof 分析輸出文件。

tracememRprofmem 用於跟蹤內存使用的其他方法。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Enable Profiling of R's Execution。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。