2013-08-12 7 views
5

ho messo insieme una funzione di Emacs al fine di inviarefunzioni di tempo automaticamente sempre in R

tOne <- proc.time()[3] 

prima del mio tasto "send-to-R", seguita da

tTwo <- proc.time()[3] 

dopo, poi la stampa la differenza. La stampa diventa piuttosto complicata però.

C'è un modo migliore in R per il tempo automaticamente tutto inviato a R? (Come ad esempio in F # #time "on")


EDIT: Attualmente, invia alcune nuove righe in più in quanto il buffer inferiore ha bisogno le stringhe da inviare:

> > a<-ocorrelate.parallel(replicate(2, rnorm(100000)), 0.5) 


> 
+ user 0.072 sys 0.020 elapsed 14.925 
> > a<-ocorrelate.parallel(replicate(2, rnorm(100000)), 0.5) 


> 
+ user 0.088 sys 0.032 elapsed 16.868 
> > 

Funzione:

(defun ess-timed-cc (vis) 
    (interactive "P") 
    (process-send-string "R" "tone <- proc.time()[1:3];") 
    (ess-eval-region-or-function-or-paragraph-and-step vis) 
    (process-send-string "R" "ttwo <- proc.time()[1:3]; cat(paste(c(\"\", 
     format(ttwo-tone)), c(\"user\", \"sys\", \"elapsed\", \"\n\")));") 
    (other-window 1) 
    (inferior-ess-send-input) 
    (inferior-ess-send-input) 
    (goto-char (point-max)) 
    (other-window -1) 
) 
+0

che cosa è esattamente disordinato per la stampa? – eddi

+0

@eddi Aggiornamento della risposta. – PascalVKooten

+0

Vedo, puoi aggiungere anche le funzioni di emacs che usi per ottenere quell'output? – eddi

risposta

1

Puoi attivare il profiling in R e ti dirà la quantità relativa di tempo trascorso in ogni funzione, che potrebbe essere quello che desideri. Vedi ?Rprof per i dettagli.

È inoltre possibile utilizzare addTaskCallback per aggiungere un callback per mostrare il tempo trascorso dall'ultima espressione, sebbene questa volta includa qualsiasi ora di inattività e il momento in cui digitare l'espressione, non solo il tempo di esecuzione. Se hai già tutti i comandi in un file e li mandi semplicemente sulla riga di comando, questo dovrebbe funzionare abbastanza bene.

Ci possono essere anche alcuni ganci che è possibile impostare per avviare e interrompere il cronometraggio, ma non tutte le funzioni hanno ganci.

Per la soluzione emacs è possibile utilizzarlo per avvolgere la chiamata in system.time anziché chiamare proc.time due volte e sottrarre.

È anche possibile utilizzare la funzione trace per inserire le 2 chiamate su proc.time all'inizio e alla fine di ciascuna funzione desiderata. Ciò richiederebbe un vettore dei nomi delle funzioni che si desiderava impostare per il tempo, ma ls potrebbe essere d'aiuto.

+0

Sono a conoscenza di Rprof, ma in il mio punto di vista era più per trovare i colli di bottiglia. Il mio modo di immaginare è più di una stampa casual facilmente visualizzabile. – PascalVKooten

+0

+1 addTaskCallback è comunque un buon suggerimento. – PascalVKooten

+0

@Dualinity, ho aggiunto un paio di altre idee che potrebbero essere possibilità. –