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) 来了解它是如何实现的。

by
你能修改你的代码以输出秒级时间吗?
by
当然可以。你需要将数字除以 `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))`。
...