gpt4 book ai didi

macros - Common Lisp 宏对调用内表单的执行进行计时

转载 作者:行者123 更新时间:2023-12-01 20:17:40 25 4
gpt4 key购买 nike

我目前需要编写类似于 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

也就是说,我想对函数的外部调用进行计时,同时能够指示函数内部我想要特别关注的 block 。

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

最佳答案

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

可以扩展为:

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

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

您可以将 *counter* 变量动态绑定(bind)到 counter 类的实例。

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

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

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

关于macros - Common Lisp 宏对调用内表单的执行进行计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50881239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com