2010-01-15 11 views
6

He estado tratando de investigar qué son las cerdas del tiempo en algún código R que he escrito, entonces estoy usando Rprof. La salida no es muy útil sin embargo:Obteniendo más información de 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 
... 

¿Hay alguna manera de profundizar y averiguar qué invocaciones específicas de $<-.data.frame y FUN (que es probablemente de by()), etc., son en realidad los culpables? ¿O tendré que refactorizar el código y hacer trozos funcionales más pequeños para obtener resultados más precisos?

La única razón por la que me resisto a la refactorización es que tendría que pasar estructuras de datos a las funciones, y todo el paso es por valor, por lo que parece un paso en la dirección incorrecta.

Gracias.

Respuesta

4

El paquete existente CRANprofr y proftools son útiles para esto. Este último puede usar Rgraphviz que no siempre es instalable.

El R Wiki page on profiling tiene información adicional y un buen script de Romain que también puede visualizar (pero requiere graphviz).

+0

url roto, tal vez es esto ahora [aquí] (http://rwiki.sciviews.org/doku.php?id=tips:misc:profiling). – hhh

0

Analizando la salida que Rprof genera no es demasiado difícil, y luego se obtiene acceso a absolutamente todo.

2

Rprof toma muestras de la pila de llamadas en intervalos de tiempo - esa es la buena noticia.

Lo que haría sería obtener acceso a las muestras de pila sin procesar (stackshots) que recoge, y elegir varias al azar y examinarlas. Lo que estoy buscando son los sitios de llamadas (no solo las funciones, sino los lugares donde una función llama a otra) que aparecen en múltiples muestras. Por ejemplo, si aparece un sitio de llamada en el 50% de las muestras, entonces eso es lo que cuesta, porque su posible eliminación ahorraría aproximadamente el 50% del tiempo total. (Parece obvio, ¿verdad? Pero no es muy conocido.)

No todos los sitios de llamadas costosas son optimizables, pero algunos son a menos que el programa ya sea lo más rápido posible.

(No se distraiga con cuestiones como la cantidad de muestras que necesita mirar. Si algo le va a ahorrar una fracción de tiempo razonable, entonces aparece en una fracción similar de muestras. El número exacto no lo hace Lo que importa es que lo encuentre. Tampoco se distraiga con el gráfico, la recursión, la medición del tiempo y los problemas de conteo. Lo que importa es, para cada sitio de llamadas que ve, la fracción de muestras de la pila que lo muestran)

Cuestiones relacionadas