Me gustaría medir el tiempo que lleva repetir la ejecución de una función. ¿Son
replicate()
y usan for-loops equivalentes? Por ejemplo:system.time(replicate(1000, f())); system.time(for(i in 1:1000){f()});
Cuál es el método preferido.
En la salida de
system.time()
, ¿essys+user
el tiempo real de CPU para ejecutar el programa? ¿Eselapsed
una buena medida del rendimiento del tiempo del programa?
36
Respuestas:
Para una sincronización efectiva de los programas, especialmente cuando está interesado en comparar soluciones alternativas, ¡necesita un control! Una buena manera es poner el procedimiento que estás cronometrando en una función. Llame a la función dentro de un ciclo de tiempo. Escriba un procedimiento de código auxiliar, esencialmente eliminando todo el código de su función y simplemente regresando de él (pero deje todos los argumentos). Coloque el trozo en su ciclo de tiempo y vuelva a cronometrar. Esto mide todos los gastos generales asociados con el tiempo. Reste el tiempo de resguardo del tiempo del procedimiento para obtener la red: esta debería ser una medida precisa del tiempo real necesario.
Debido a que la mayoría de los sistemas hoy en día pueden interrumpirse de manera perentoria, es importante realizar varias ejecuciones de temporización para verificar la variabilidad. En lugar de hacer una larga carrera de segundos, m ejecuciones de aproximadamente N / m segundos cada una. Es útil hacer esto en un bucle doble todo de una vez. No solo es más fácil de manejar, sino que introduce un poco de correlación negativa en cada serie de tiempo, lo que en realidad mejora las estimaciones.norte metro norte/ m
Al utilizar estos principios básicos de diseño experimental, esencialmente controla las diferencias debidas a la forma en que implementa el código (por ejemplo, la diferencia entre un bucle for y replicate ()). Eso hace que tu problema desaparezca.
fuente
Con respecto a sus dos puntos:
replicate()
ya que es funcional.elapsed
, es decir, el tercer número.Lo que hago a menudo es
para obtener una media recortada del 90% de N repeticiones de llamadas
f()
.(Editado, gracias a Hadley por atrapar un thinko).
fuente
mean(replicate(N, system.time(f(...))[3]), trim = 0.05)
?También puede cronometrar con pasos de tiempo devueltos por
Sys.time
; esto, por supuesto, mide el tiempo de pared, por lo que el tiempo de cálculo en tiempo real. Código de ejemplo:fuente
Con respecto a qué métrica de tiempo usar, no puedo agregar a los otros respondedores.
Con respecto a la función a usar, me gusta usar el punto de referencia? Del paquete rbenchmark .
fuente
Ellos hacen cosas diferentes. Mide el tiempo que deseas hacer. replicate () devuelve un vector de resultados de cada ejecución de la función. El bucle for no. Por lo tanto, no son declaraciones equivalentes.
Además, cronometra varias maneras en que desea que se haga algo. Entonces puedes encontrar el método más eficiente.
fuente