2010-02-03 4 views
23

Nach SICP section 1.2.6 ausüben 1,22:Gibt es eine Entsprechung zu Lisps "Laufzeit" -Primitiv in Scheme?

meisten Lisp-Implementierungen umfassen eine primitive genannte Laufzeit, die eine ganze Zahl zurückgibt, der die Zeitmenge angibt, das System in Betrieb war (gemessen zum Beispiel in Mikrosekunden).

Ich benutze DrScheme, wo Laufzeit scheint nicht verfügbar zu sein, so bin ich auf der Suche nach einem guten Ersatz. Ich fand in der PLT-Schema-Referenz, dass es ein current-milliseconds Grundelement gibt. Weiß jemand, ob es einen Timer in Scheme mit besserer Auflösung gibt?

+0

Ich kam gerade über genau dieses Problem :) –

+0

Interessant, dass ich Bill the Lizard Blog bin mit meiner zu überprüfen Antworten, wie ich 4 Jahre nach SICP durchgehe, nachdem er durchging. Hast du das gesehen, als du diese Frage gestellt hast, Mr. Lizard? –

+0

Hier ist ein Kern mit einem alternativen "timed-prime-test", der in "Racket" funktioniert: https://gist.github.com/Isaac-Kleinman/1b623bc2463b241b4383 –

Antwort

20

current-milliseconds ist eine Funktion, die die aktuelle Millisekunden-Zählung aus dem System zurückgibt, sie kann jedoch abnehmen. current-inexact-milliseconds ist ähnlich, gibt aber eine garantiert steigende Gleitkommazahl zurück.

Es gibt auch eine Reihe von ähnlichen Funktionen, die Sie auf dieser Seite finden können, aber wenn alles, was Sie eine bestimmte Funktion zu Zeit benötigen, dann benutzen Sie einfach (timeausdr) und es wird die Zeit, die auszudrucken um den Ausdruck zu bewerten.

Eine andere Sache, die hier relevant ist, ist die profiler, falls Sie eine ausführlichere Analyse Ihres Codes benötigen.

+4

Das ist falsch. Erstens gibt es keine direkte Beziehung zwischen SICP und PLT. Zweitens kommt der Millisekunden-Zähler vom OS, und da Interrupt-Handler auf der Ebene von einigen Millisekunden behandelt werden, gibt es in einem feineren Zähler keinen Sinn. Die Granularität liegt normalerweise bei ~ 20 ms, nicht einmal bei 1 ms. Wenn Sie eine Sprache mit beispielsweise einem Nanosekundenzähler haben, werden Sie keine besseren Ergebnisse erzielen. Drittens ist es eine schlechte Idee, die Laufzeit auf der msec-Ebene zu messen. Sie müssen die Auswertung oft genug wiederholen, um eine beträchtliche Anzahl zu erhalten, da sonst die Laufzeit im Rauschen verloren geht. –

+0

Es ist "Strom-Millisekunden", nicht "Strom-Millisekunde". Ich habe versucht, die Antwort zu bearbeiten, aber SO benötigt mindestens 6 Zeichen in der Bearbeitung. –

+0

Ich habe es behoben ... –

3

Ich bin heute auch auf dieses Problem gestoßen. Ich benutze DrRacket, da es DrScheme abgelöst zu haben scheint. Obwohl dies ein alter Thread ist, füge ich meine Ergebnisse für jeden hinzu, der über diesen Thread stolpert.

Mit R5RS als gewählter Sprache, fügen Sie folgende zwei Zeilen vor dem Programm, um es

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

Kannst du bitte die genaue '#lang ...' Zeichenfolge sagen? '#lang R5RS' funktioniert nicht. – Zelphir

+0

Ok, ich habe einfach einen "else" Zweig zum unvollständigen 'if' des Buchcodes hinzugefügt, so dass es in' #lang racket' läuft. – Zelphir

+0

@Zelphir: Normalerweise wähle ich einfach "R5RS" von links unten als Sprache in DrRacket. Es hat damals für mich funktioniert. – kaustubh

Verwandte Themen