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) " s")))
       ret#))

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