gpt4 book ai didi

performance - 在 Common Lisp 中,函数和宏之间有性能差异吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:41 28 4
gpt4 key购买 nike

考虑以下两个定义:

(defun fun-add (a b) (+ a b))
(defmacro macro-add (a b) `(+ ,a ,b))

以我有限的理解,“运行”一个函数会比一个宏更快,因为“运行一个宏”还涉及代码扩展。但是,我使用 SBCL 得到以下结果:

CL-USER> (time (loop for i below 1e7
do (fun-add 15 25)))
Evaluation took:
0.180 seconds of real time
0.179491 seconds of total run time (0.179491 user, 0.000000 system)
99.44% CPU
396,303,718 processor cycles
0 bytes consed

NIL


CL-USER> (time (loop for i below 1e7
do (macro-add 15 25)))
Evaluation took:
0.034 seconds of real time
0.033719 seconds of total run time (0.033719 user, 0.000000 system)
100.00% CPU
74,441,518 processor cycles
0 bytes consed

NIL

为什么会这样?

最佳答案

Is there a way to get it to expand multiple times?

事实上,是的。

这是一个例子,首先是使用宏时通常预期的情况,即宏在求值前仅展开一次:

; SLIME 2.23
CL-USER> (defmacro test () (print "EXPANDING"))
TEST
CL-USER> (test)

"EXPANDING" ;; printed
"EXPANDING" ;; return value

CL-USER> (dotimes (i 10) (test))

"EXPANDING"
NIL

现在,切换到解释模式:

CL-USER> (setf sb-ext:*evaluator-mode* :interpret)
:INTERPRET

CL-USER> (dotimes (i 10) (test))

"EXPANDING"
"EXPANDING"
"EXPANDING"
"EXPANDING"
"EXPANDING"
"EXPANDING"
"EXPANDING"
"EXPANDING"
"EXPANDING"
"EXPANDING"

解释模式对 w.r.t 很有用。如果您想开发宏并且不想在每次更新代码时都重新编译所有调用者,请使用宏。

然而,性能会受到影响,因此我认为基准测试无关紧要。此外,您最初提出的问题是比较苹果和橘子,因为宏的目的与函数的目的完全不同。

关于performance - 在 Common Lisp 中,函数和宏之间有性能差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56460389/

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