我目前需要编写与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
也就是说,我想对函数进行外部调用,同时能够在其中指出我想特别关注的块。
问题是这样的事情是否已经存在。此外,如果我需要实现这一点,你会建议从哪里开始或一些有用的功能/宏为此。不一定寻找可行的解决方案,但欢迎指导和指导:)
答案 0 :(得分:2)
(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
获得一个内部前/后计数器来测量时间。