根据网上的资料结合我自己的实验 增大gc-cons-threshold的值可以加快Emacs的启动 方法是

1
(setq gc-cons-threshold (* 50 1024 1024))

这个值控制了垃圾回收的频率 默认是800000 即每分配大约800K的内存就进行一次垃圾回收 有点频繁了 尤其对于现代的计算机 又尤其对于启动 所以我把它改成了50M 这样不仅启动时间从2.8s加快到了2.1s(加速25%) 感觉干其他工作也快了

是这样么 为什么不问问神奇的乌龟呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(defun iterate (xx yy)
(let*
((BAILOUT 16.0)
(MAX_ITERATIONS 1000)
(bail_val 0)
(cr (- yy 0.5))
(ci xx)
(zi 0.0)
(zr 0.0)
(i 0))

(while (and (< i MAX_ITERATIONS) (< bail_val BAILOUT))
(setq i (+ 1 i))
(setq temp (* zr zi))
(setq zr2 (* zr zr))
(setq zi2 (* zi zi))
(setq zr (+ (- zr2 zi2) cr))
(setq zi (+ temp temp ci))

(setq bail_val (+ zi2 zr2)))
i))

(defun mandelbrot()
(setq yy -39)
(while (< yy 39)

(setq yy (+ 1 yy))

(setq xx -39)
(while (< xx 39)
(setq xx (+ 1 xx))

(if (= (iterate (/ xx 40.0) (/ yy 40.0)) 1000)
(princ "*")
(princ " ")))
(princ "\n")))

benchmark-run-compiled测试一下这个代码 结果是

GC频率 用时/s GC发生的次数 GC用时/s
800K 2.037 169 0.794
8M 1.500 16 0.146
80M 1.421 1 0.046
800M 1.361 0 0

结论 通过减少垃圾回收能够获得大约25%的性能提升

2022-11-1 Update:

7年后,通过native-comp,上面这个测试用时2.7203e-05,快了10万倍吧。但下面的代码还是比C的版本慢几百倍。

Update:

1
2
3
4
5
6
7
(defun f (v)
(if (< v 2)
1
(+ (f (- v 1))
(f (- v 2)))))

(benchmark-run-compiled 1 (f 40))

这段代码可以测整数运算速度,和C相比Emacs Lisp慢100多倍。