2017-01-02 3 views
1

Ich versuche, die Ausführungszeit einer Funktion in clojure zu extrahieren und zu schreiben, aber aufgrund meiner fehlenden Erfahrung in clojure kann ich es nicht herausfinden. Gibt es einen Weg, dies zu tun? Wenn möglich, wäre ein Codebeispiel perfekt. Unten ist ein Beispiel für die Methode, die ich anrufe. Vielen Dank.Extrahieren und Schreiben der Ausführungszeit einer Funktion in clojure

(dotimes [i 3] 
    (with-open [rdr (reader (str ""))] 
    (doseq [line (line-seq rdr)] 
     (display-huffman-encode line)))) 
+0

zur Zeit habe ich eine Funktion, die Komprimierung von Strings tut und ich möchte diese Funktion mehrmals ausführen. Bei jeder Ausführung würde ich die Ausführungszeit in eine Datei schreiben wollen, um eine Analyse durchführen zu können. – Patrick

+0

Ok ist fertig. Die Funktion, die ich anrufe, ist meine Frage. – Patrick

+0

Um Code in die Frage einzufügen - fügen Sie ihn einfach ein, wählen Sie dann alle aus und drücken Sie entweder 'ctrl' +' K', oder benutzen Sie die '{}' Taste in der Werkzeugleiste. –

Antwort

1

Zur Ausführungszeit eines Ausdrucks Messung können Sie (time exp) (check out https://clojuredocs.org/clojure.core/time) verwenden. Es druckt auf stdout, also schätze ich, dass Sie einfach Ihre in time eingewickelte Funktion in irgendeiner Schleife auswerten und die Ausgabe in einer Datei später speichern können.

0

Methode 1: Verwenden Sie Zeitmakro. (time exp) wird normalerweise für Zeitfunktionen verwendet, schreibt aber in die verstrichene Zeit bis zur Standardausgabe und nicht in eine Datei. Sie können "write-out-str" verwenden, um zu erfassen, was an die Standardausgabe gesendet wird, und das Ergebnis in eine Datei schreiben (mit "spit"). Diese Lösung wird (anhängt „times.txt“ to file):

(use 'clojure.java.io) 
(dotimes [i 3] 
    (with-open [rdr (reader "input.txt")] 
    (doseq [line (line-seq rdr)] 
     (spit "times.txt" (with-out-str (time (display-huffman-encode line))) :append true)))) 

Methode 2: Erstellen Sie Ihre eigenen Makros, die eine Funktion ausgeführt wird und gibt die verstrichene Zeit. Das zurückgegebene Ergebnis könnte dann in eine Datei geschrieben werden. Diese Lösung ist unten gezeigt ("Bank" ist die Timing-Routine und ich habe separate Funktionen für die Protokollierung und Anzeige-Huffman-Codierung hinzugefügt).

(use 'clojure.java.io) 
(defn log-info 
    " Places a newline so every time is on a different line " 
    [file-name s] 
    (spit file-name (format "%s %n" (str s)) :append true)) ; %n places 
           ; platform independent newline after each time 

(defmacro bench 
    " Times the execution of your function, 
    discarding the output and returning the elapsed time in seconds 
    (you can modify this by changing the divisor from 1e9 (i.e. for milliseconds it would be 1e6." 
    ([& forms] 
    `(let [start# (System/nanoTime)] 
     [email protected] 
     (double (/ (- (System/nanoTime) start#) 1e9))))) ; Time in seconds 

(defn display-huffman-encode [x] 
    " Test example of your display function--just sleeps for 100 ms each time its called to simulate processing " 
    (Thread/sleep 100)) ; Sleeps 100 ms 

; Example code using the above elements 
; Reading and writing to the working directory with input from "input.txt" and logging output times to "times.txt" as the logged times 
(dotimes [i 3] 
    (with-open [rdr (reader "input.txt")] 
    (doseq [line (line-seq rdr)] 
    (log-info "times.txt" (bench (display-huffman-encode line)))))) 
+0

Vielen Dank für Ihre Antwort. – Patrick

Verwandte Themen