lambda vs let?

目的是搞一个类似实时计算的变量的东西,我可以存一个lambda,需要这个变量的时候传参数,或者直接存sexp,参数用一个特殊特殊symbol表示(这里是var,可能会用SELF啥的),用的时候包裹在letscope里。

我想知道哪种更好(效率高,速度和内存方面)但是对底层的实现了解不深没法判断。我用benchmark测试感觉差不多。

;;; 1
(funcall (lambda (var) (+ var 1)) 1)
;;; 2
(let ((var 1)) (+ var 1))

(benchmark-run 1000 (funcall (lambda (var) (+ var 1)) 1))
(0.0003710000000000001 0 0.0)
(0.00016800000000000002 0 0.0)
(0.00016900000000000002 0 0.0)
(0.000178 0 0.0)
(0.00016899999999999996 0 0.0)
(0.00034 0 0.0)
(0.00032300000000000004 0 0.0)
(0.00032599999999999996 0 0.0)

(benchmark-run 1000 (let ((var 1)) (+ var 1)))
(0.000158 0 0.0)
(0.000156 0 0.0)
(0.000157 0 0.0)
(0.00015800000000000002 0 0.0)
(0.00015700000000000002 0 0.0)
(0.00030500000000000004 0 0.0)
(0.000433 0 0.0)
(0.000306 0 0.0)

P.S. 话说lambda里面用的是不是就是let啊……我不能确定

P.S. 标题真的想不出来,原谅我起名废

恭喜你,答对了

所以理论上#2比#1效率高?

然而你不是要传参数么。用编译后的 lambda 比直接传 sexp 快

let里面用的就是 lambda

所以是什么情况

你用了 funcall,应該用 ((lambda (var) (+ var 1)) 1)

(byte-compile (lambda (var) (+ var 1)))
#[(var) "T\207" [var] 1]

(benchmark-run 1000 (#[(var) "T\207" [var] 1] 1))
(0.00015 0 0.0)

(benchmark-run 1000 (let ((var 1)) (+ var 1)))
(0.00020800000000000001 0 0.0)
2 个赞