2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面获取有关此操作的一些更多信息。

0
编译器

我正在尝试获取clojure中函数的执行时间,所以我决定将系统纳秒时间存储在名为start的变量中,然后在方法执行后获取它,获取差值并打印出来。以下是代码
(def start(System/nanoTime)) ;;此处有一些函数调用 (def end(System/nanoTime)) ;;下面我需要代码来打印两个之间的差值 (println "该调用花费了这些纳秒来执行")

1 答案

+2

选择
 
最佳答案

def 在当前命名空间中定义一个全局变量。将全局变量定义用来度量函数调用时间可能不是一个好主意。例如,假设你想测量调用 (+ 1 2)。可以使用 let 来度量时间(而不是 def),并使用 println 打印所需时间,如下所示

(let [start (System/nanoTime)
      ret (+ 1 2)
      end (System/nanoTime)]
   (println (str "Elapsed time: " (- end start) " ns"))
   ret)

clojure.core/time 把这精确地放入宏中(有一个不同之处,它以毫秒为单位打印所需时间)。因此,上述代码与 (time (+ 1 2)) 等效。检查 (source time) 来了解它是如何完成的。

作者:
你能修改一下代码,使其输出秒数吗?
作者:
当然可以。你需要把数字除以 `1000000000.0` 来转换成秒。

以下是修改后的 `clojure.core/time` 版本,它以秒为单位打印时间。

    (defmacro time-sec [expr]
      `(let [start# (. System (nanoTime))
             ret# ~expr]
         (prn (str "耗时: " (/ (double (- (. System (nanoTime)) start#)) 1000000000.0) " 秒"))
         ret#))

要使用它,你可以执行 `(time-sec (+ 1 2))`。
...