2016-11-10 52 views
0
(time(get_report)) 

給我「已用時間32038毫秒」。但我想要秒,而不是毫秒。我怎樣才能在Clojure中實現這一點?以秒爲單位的打印執行時間功能?

我希望它打印像「報告花了32秒」。

上我現在該怎麼把它更新:

(defmacro time 
    "Evaluates expr and prints the time it took. Returns the value of 
    expr." 
{:added "1.0"} 
[expr] 
`(let [start# (. System (nanoTime)) 
    ret# ~expr] 
(prn (str "Report print time: " (/ (double (- (. System (nanoTime)) start#)) 1000000000.0) " secs")))) 

(time(get_report)) 

這是我gather_report功能:

(defn gather_report [] 

(def list_of_isbns (split_isbns "src/clj_amazon/isbn_list.txt")) 
(get_title_and_rank_for_all_isbns list_of_isbns) 
) 
+1

只需創建一個自定義版本的宏。查看來源並查看他們是如何做到的。我創建了我自己的版本,可以返回時間而不是打印它。花費10秒鐘。 – Carcigenicate

+0

並且不要在函數中使用'def'!看到我的答案,看看爲什麼! – Carcigenicate

回答

1

這是標準定義:

(defmacro time 
    "Evaluates expr and prints the time it took. Returns the value of 
expr." 
    {:added "1.0"} 
    [expr] 
    `(let [start# (. System (nanoTime)) 
     ret# ~expr] 
    (prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs")) 
    ret#)) 

注意除法形式?只需除以1000即可轉換爲秒。您可以更改消息藏漢:

(defmacro time 
    "Evaluates expr and prints the time it took. Returns the value of 
expr." 
    {:added "1.0"} 
    [expr] 
    `(let [start# (. System (nanoTime)) 
     ret# ~expr] 
    (prn (str "Report print time: " (/ (double (- (. System (nanoTime)) start#)) 1000000000.0) " secs")) 
    ret#)) 

找東西的來源,最好的辦法是查找Clojure的文檔的功能,並遵循「源」鏈接。

這就是爲什麼你不使用def函數定義裏面:

(defn test-fn [] 
    (def some-val 20) 
    (* some-val some-val) 

(test-fn) 

(println some-val) 
; prints 20! 

def創建一個全局值。你當然不希望那樣!使用let來代替限制範圍:

(defn test-fn [] 
    (let [some-val 20] 
     (* some-val some-val)) 
+0

我添加(:refer-clojure:排除[時間])來排除時間宏。然後重新定義它。但我不斷收到錯誤「錯誤的參數數量(1)傳遞到時間」 – lalakers4life

+0

這是我的電話。 (time(get_report)) – lalakers4life

+0

@ lalakers4life你一定已經把這個定義粘貼了。確保宏的參數列表需要1個參數 – Carcigenicate

0

可以使time macro修改後的版本爲您量身打造:

(defmacro sectime 
    [expr] 
    `(let [start# (. System (currentTimeMillis)) 
     ret# ~expr] 
    (prn (str "Elapsed time: " (/ (double (- (. System (currentTimeMillis)) start#)) 1000.0) " secs")) 
    ret#)) 
+0

我已更新到我現在遇到的問題。我一直得到「錯誤的參數數量(1)傳遞到時間」 – lalakers4life

相關問題