2010-02-03 10 views
23

Secondo SICP section 1.2.6, esercitare 1.22:Esiste un equivalente della primitiva "runtime" di Lisp in Scheme?

maggior parte delle implementazioni Lisp include un runtime chiamato primitiva che restituisce un numero intero che specifica la quantità di tempo che il sistema è stato in esecuzione (misurata, per esempio, in microsecondi).

Sto usando DrScheme, dove il runtime non sembra essere disponibile, quindi sto cercando un buon sostituto. Ho trovato nel PLT-Scheme Reference che esiste una primitiva current-milliseconds. Qualcuno sa se c'è un timer in Scheme con una risoluzione migliore?

+0

Ho appena incontrato esattamente questo problema :) –

+0

interessante che sto usando Bill blog del Lizard per controllare la mia risposte mentre sto passando SICP 4 anni dopo che l'ha esaminato. Hai visto questo quando hai fatto questa domanda, signor Lizard? –

+0

Ecco un esempio con un 'time-prime-test' alternativo che funziona in' racket': https://gist.github.com/Isaac-Kleinman/1b623bc2463b241b4383 –

risposta

20

current-milliseconds è una funzione che restituisce il conteggio del millisecondo corrente dal sistema, ma potrebbe diminuire. current-inexact-milliseconds è simile, ma restituisce un numero in virgola mobile garantito in aumento.

Ci sono anche una serie di funzioni simili che si possono trovare su quella pagina, ma se tutto ciò che serve è il tempo una certa funzione, poi basta usare (timeespr) e sarà stampare il tempo impiegato per valutare l'espressione.

Un'altra cosa che è rilevante qui è il profiler, nel caso sia necessaria qualche analisi più dettagliata del codice.

+4

Questo è sbagliato. Innanzitutto, non esiste una relazione diretta tra SICP e PLT. In secondo luogo, il contatore del millisecondo proviene dal sistema operativo e, poiché i gestori di interrupt vengono gestiti al livello di pochi millisecondi, non c'è alcun punto in un contatore più fine. La granularità è di solito a ~ 20ms, nemmeno 1ms. Se hai un linguaggio con, per esempio, un contatore di nanosecondi, non otterrai risultati migliori. In terzo luogo, misurare il runtime a livello di msec è una cattiva idea, è necessario ripetere la valutazione abbastanza volte per ottenere un conteggio sostanziale, altrimenti il ​​tempo di esecuzione verrà perso nel rumore. –

+0

È 'corrente-millisecondi', non' corrente-millisecondo'. Ho provato a modificare la risposta ma SO richiede un minimo di 6 caratteri nella modifica. –

+0

L'ho risolto ... –

3

Anche oggi ho riscontrato questo problema. Sto usando DrRacket, in quanto sembra aver superato DrScheme. Anche se questo è un vecchio thread, sto aggiungendo i miei risultati per chiunque sia nuovo che si imbatte in questo thread.

Con R5RS come lingua selezionata, aggiungere seguendo due linee prima che il programma per farlo funzionare

(#%require (only racket/base current-milliseconds)) 
(define (runtime) (current-milliseconds)) 
+0

Puoi dire la stringa esatta di #lang ... 'per favore? '#lang R5RS' non funziona. – Zelphir

+0

Ok, ho semplicemente aggiunto un ramo "else" al "if" incompleto del codice del libro, in modo che venga eseguito in "#lang racket". – Zelphir

+0

@Zelphir: io di solito seleziono "R5RS" in basso a sinistra come lingua in DrRacket. Ha funzionato per me allora. – kaustubh

Problemi correlati