Emacs -- 在Emacs Lisp中计时函数调用

13

我需要一些帮助来测量一个使用while循环的函数调用时间 - 即,当函数抛出完成时,时钟应该停止。我在邮件列表上找到了以下计时器:http://lists.gnu.org/archive/html/help-gnu-emacs/2008-06/msg00087.html

(defmacro measure-time (&rest body)
  "Measure the time it takes to evaluate BODY."
  `(let ((time (current-time)))
     ,@body
     (message "%.06f" (float-time (time-since time)))))

它的使用方法如下:

(measure-time
  (dotimes (i 100000)
    (1+ 1)))

使用计时器宏和 while 循环的示例将非常有帮助。我正在寻找从 while 循环开始之前到 done 抛出之后的总时间。
(defun test ()
  (measure-time)
  (catch 'done
    (while t
      [*** do a bunch of stuff]
      (when (condition-satisfied-p)
        [*** STOP THE CLOCK AND PRINT TOTAL DURATION ***]
        (throw 'done nil) ))))

注意,如果 body 包含符号 time,您将会得到意外的结果。您可以通过使用 gensym 来避免此类变量捕获。 - Musa Al-hassy
2个回答

6

与您引用的示例完全一样。您只需将 (measure-time ... ) 包裹在您要计时的事物周围即可。在您的情况下,整个 catch 表达式都需要计时。

您没有尝试过吗?


啊,是的,现在它可以工作了。我没有意识到它是一个包装器——我曾经尝试将它放在开头和结尾,但没有将catch表达式夹在中间。非常感谢您——非常感激! :) - lawlist

6

顺便提一句,在Emacs中,这个宏被称为benchmark-elapse,但它不是自动加载的,所以在使用之前需要先执行(require 'benchmark)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接