【问题标题】:Common Lisp Macro That Times Execution of Forms Inside a Call在调用中计时执行表单的 Common Lisp 宏
【发布时间】:2018-06-15 18:51:01
【问题描述】:

我目前需要写一些类似于user::time 的东西,但是有一些修改。

修改如下。假设我的新宏名为time-lisp-forms。那我应该可以这样用了。

(defun test (a b)
  (let ((c (+a b)))
    (time (+ c a))
    (time (+ c b)))))

我这样调用宏:

(time-lisp-forms (test 1 2))

那么,它的输出会是这样的:

Total time for (test 1 2) = 5 sec
Time block 1: (+ c a) = 1 sec
Time block 2: (+ c b) = 3 sec

也就是说,我希望对函数的外部调用进行计时,同时能够指出其中我想特别关注的块。

问题是这样的东西是否已经存在。另外,如果我需要实现这个,你会推荐从哪里开始或一些有用的函数/宏。不一定要寻找可行的解决方案,但欢迎指导和指导:)

【问题讨论】:

    标签: macros common-lisp


    【解决方案1】:
    (time-lisp-forms (test 1 2))
    

    可以扩展为:

    (let ((*counter* (make-counter :forms '((test 1 2)))))
      (test 1 2)
      (print-summary *counter*))
    

    (或扩展为对执行相同操作的函数的调用)。

    您将*counter* 变量动态绑定到counter 类的实例。

    您的自定义 (time expr) 表达式将扩展为:

    `(call-time-block *counter* ',expr (lambda () ,expr))
    

    然后,该函数将为测试提供一个新的 id(1、2 等),并使用通过 GET-INTERNAL-RUN-TIME 获得的内部前后计数器测量时间。

    【讨论】:

    • 你是在暗示我在这种情况下有两个宏吗?一个用于外部调用,一个用于内部块?
    • 是的,只是为了简化高阶函数已经可能实现的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多