2010-01-15 92 views
6

我一直在試圖深入研究我編寫的一些R代碼中的時間,因此我使用的是Rprof。輸出還不是非常有幫助的,但:從Rprof獲取更多信息()

> summaryRprof() 
$by.self 
         self.time self.pct total.time total.pct 
"$<-.data.frame"   2.38  23.2  2.38  23.2 
"FUN"      2.04  19.9  10.20  99.6 
"[.data.frame"    1.74  17.0  5.54  54.1 
"[.factor"     1.42  13.9  2.90  28.3 
... 

是否有某種方式來深入挖掘和發現的$<-.data.frame哪些具體的調用,並FUN(這可能是從by())等實際上是罪魁禍首?或者我需要重構代碼並製作更小的功能塊以獲得更精細的結果?

我忍住重構的唯一原因是,我不得不將數據結構傳遞到功能,所有的傳球是價值,因此這似乎是在錯誤的方向邁出的一步。

謝謝。

回答

4

現有的CRANprofrproftools對此很有用。後者可以使用Rgraphviz,它不總是可以安裝的。

R Wiki page on profiling有額外的信息和羅曼一個很好的腳本,也可以可視化(但需要graphviz的)。

+0

網址被破壞,也許現在是[這裏](http://rwiki.sciviews.org/doku.php?id=tips:misc:profiling)。 – hhh 2011-04-08 00:36:00

0

進行解析時Rprof生成輸出是不是太硬,然後您可以訪問絕對一切。

2

Rprof以時間間隔取樣調用堆棧 - 這是個好消息。

我所要做的就是訪問它收集的原始堆棧樣本(stackshots),隨機挑選幾個並檢查它們。我正在尋找的是呼叫站點(不只是函數,而是函數調用另一個函數的地方),它們出現在多個樣本上。例如,如果呼叫站點出現在50%的樣本上,那麼這就是成本,因爲它可能的去除將大約節省總時間的50%。 (似乎是顯而易見的,對吧?但它不爲人所熟知。)

並不是每一個代價高昂的調用的位置是優化的,但也有一些,除非方案已經儘可能快。如果某件事會爲你節省一段合理的時間,那麼它就會出現在相似的樣本中,確切的數字並不會影響你的觀點,重要的是你可以找到它,也不要被圖表和遞歸以及時間測量和計數問題分散注意力,重要的是,對於你看到的每個調用站點,顯示它的堆棧樣本的一部分。)