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))
...