让emacs运行更流畅


#1

刚看到一个package http://akrl.sdf.org/


#2

http://blog.lujun9972.win/blog/2019/05/16/优化emacs的垃圾搜集行为/index.html

有人翻译了中文版的


#3

性能提升很明显吗?


#4

只是会减少(可能的)卡顿,平时没感觉到卡的话就不用


#5

emacs 卡顿肯定是有的,特别是当文件超过一千行的时候,我的emacs会感觉到明显的卡顿,如果是小文件(小几百行)还可以。使用了下,感觉并不能明显感觉到速度的提升。


#6

普遍的这种卡顿可能不是gc的问题。可以M-x profiler-start RET M-x profiler-report RET看看有没有可改进的地方。


#7

doom-emacs似乎就是这么优化gc的


(defvar doom-gc-cons-threshold 16777216 ; 16mb
  "The default value to use for `gc-cons-threshold'. If you experience freezing,
decrease this. If you experience stuttering, increase this.")

(defvar doom-gc-cons-upper-limit 536870912 ; 512mb
  "The temporary value for `gc-cons-threshold' to defer it.")


(defvar doom--file-name-handler-alist file-name-handler-alist)

(defun doom|restore-startup-optimizations ()
  "Resets garbage collection settings to reasonable defaults (a large
`gc-cons-threshold' can cause random freezes otherwise) and resets
`file-name-handler-alist'."
  (setq file-name-handler-alist doom--file-name-handler-alist)
  ;; Do this on idle timer to defer a possible GC pause that could result; also
  ;; allows deferred packages to take advantage of these optimizations.
  (run-with-idle-timer
   3 nil
   (lambda ()
     (setq-default gc-cons-threshold doom-gc-cons-threshold)
     ;; To speed up minibuffer commands (like helm and ivy), we defer garbage
     ;; collection while the minibuffer is active.
     (defun doom|defer-garbage-collection ()
       (setq gc-cons-threshold doom-gc-cons-upper-limit))
     (defun doom|restore-garbage-collection ()
       ;; Defer it so that commands launched from the minibuffer can enjoy the
       ;; benefits.
       (run-at-time 1 nil (lambda () (setq gc-cons-threshold doom-gc-cons-threshold))))
     (add-hook 'minibuffer-setup-hook #'doom|defer-garbage-collection)
     (add-hook 'minibuffer-exit-hook  #'doom|restore-garbage-collection)
     ;; GC all sneaky breeky like
     (add-hook 'focus-out-hook #'garbage-collect))))

#8

我现在使用latex,超过一千行的时候就感觉非常卡顿了。现在并不清楚什么原因。我按照你说的,报告如下,看看是什么问题的。


#9

flyspell用了1/3的CPU时间,关闭试一试?


#10

现在明显好好点。


#11

pyim占用也很高啊


#12

都关闭后,现在感觉好多了,我的latex代码大概1500行。现在基本上感觉还行,没有感觉到特别卡顿的。原来卡顿的太严重,在加入内容就感觉emacs很“肉”,很慢,简直受罪。


#13

pyim是因为在输入吧,应该跟卡顿关系不大


#14

自从使用pyim,经常会出现卡2-3秒,回去试一下,看看效果如何?


#15

CPU 占用那么高,肯定会造成卡顿啊。个人并不建议使用 pyim,在系统层面用输入法性能肯定会高很多的,除非是在纯终端下。


#16

今天早上,在emacs配置中调整了gc回收策略,如下:

(defmacro k-time (&rest body) “Measure and return the time it takes evaluating BODY.” `(let ((time (current-time))) ,@body (float-time (time-since time))))

;; Set garbage collection threshold to 512M. (setq gc-cons-threshold #x20000000)

;; When idle for 15sec run the GC no matter what. (defvar k-gc-timer (run-with-idle-timer 15 t (lambda () (message “Garbage Collector has run for %.06fsec” (k-time (garbage-collect))))))

截至到中午,还没有遇到卡顿问题。 另外:使用pyim,可以开启 (setq pyim-dcache-backend 'pyim-dregcache),减少内存占用 参考大神指点:https://github.com/tumashu/pyim/issues/304


#17

pyim 越用越好用


#18

用了这个后pyim卡顿明显好了很多!


#19

还是elisp VM的GC太垃圾了,不然也犯不着人工优化这种东西 :stuck_out_tongue:


#20

用了下楼主提供的链接里的代码,速度确实有明显提升,多谢。