性能优化求大神指导

感觉 elisp 在性能上还是和 js 有比较大的差距。如果按照 js 的库一比一的 port 的话,性能惨不忍睹。js 在字符串处理上性能相当好。

elisp 里面尽量利用 buffer 里面的内容也还是差一大截。

elisp性能和Python(CPython implementation)大概同一级

按理说字符串上大家都是用utf-8,应该差不多。主要还是运行速度的差距。

Emacs 26.1 以及之前的 pcase 用的是 eq,不知道后来怎么就改成 eql 了,好像 NEWS 也没有解释

~ $ emacs-26.1 -Q --batch --eval "(print (macroexpand '(pcase 1 (1 t))))"

(if (eq 1 1) (progn t) nil)
~ $ emacs -Q --batch --eval "(print (macroexpand '(pcase 1 (1 t))))"

(if (eql 1 1) (progn t) nil)

parinfer 原本的逻辑是一个大字符串来处理的,在 emacs 里面如果把 buffer 里的字符串拿出来,好像做什么性能都不是太好。也可能我写的不好,但是那样比我现在这样的方式要差至少几十倍。

在学Elisp, 想请大神帮忙解释一下 (declare (indent 1) (debug cl-case)) 里面(debug cl-case)怎么解释, 有什么用处? 看文档在第18章完全不懂 :crazy_face:

我说的是性能问题.

你想表达的是啥?

说的就是性能问题,你以为是啥?

一坨面条代码还要啥性能?

我说的是性能问题,你这句的意思是 elisp 不需要性能?那这问题你回复我干嘛,我又不是在说 elisp 需要不需要性能。

你也不能撸的和js 一样烂啊

  1. js 不是我发明的
  2. 我不写 js
  3. js 烂不烂和我的话题没有关系

我只看到你在发泄情绪,还特意找个人来做发泄对象,真不幸我被选中了。

已经禁言一周,如果不能帮助别人,不要无故攻击别人。

2 个赞

今天尝试了一下用 cl-case 来判断系统类型,用 cl-loop 来配置中文字体。发现这个两个速度确实比较慢。 windows 平台上,cl-case 比用 eq 慢了 0.03s, cl-loop 比 用 dolist 慢了 0.06s Mac 平台上差异也稍微慢一点,但差异没那么明显。

(defvar font-list
  (cl-case system-type
    (darwin
     '(("SF Mono" . 130) ("Monaco" . 130) ("Menlo" . 130)))
    (windows-nt
     '(("SF Mono" . 110) ("Consolas" . 120) ("Cascadia Mono" . 110)))
    (gnu/linux
     '(("SF Mono" . 110) ("Consolas" . 120) ("Cascadia Mono" . 110))))
  "List of fonts and sizes.  The first one available will be used.")

(defun font-installed-p (font-name)
  "Check if font with FONT-NAME is available."
  (find-font (font-spec :name font-name)))

(defun change-font ()
  "Set English font from the `font-list'."
  (interactive)
  (let* (available-fonts font-name font-size)
    (dolist (font font-list
                  (setq available-fonts (nreverse available-fonts)))
      (when (font-installed-p (car font))
        (push font available-fonts)))
    (if (not available-fonts)
        (message "No fonts from the chosen set are available")
      (if (called-interactively-p 'interactive)
          (let* ((chosen (assoc-string
                          (completing-read "What font to use? "
                                           available-fonts nil t)
                          available-fonts)))
            (setq font-name (car chosen)
                  font-size (read-number "Font size: " (cdr chosen))))
        (setq font-name (caar available-fonts)
              font-size (cdar available-fonts)))
      (set-face-attribute 'default nil :font font-name :height font-size))))

(when (display-graphic-p)
  ;; Set default font
  (change-font)

  ;; Specify font for all unicode characters
  (cl-loop for font in '("Apple Color Emoji" "Segoe UI Symbol" "Noto Color Emoji" "Symbola")
           when (font-installed-p font)
           return (set-fontset-font t 'unicode font nil 'prepend))

  ;; Specify font for Chinese characters
  (cl-loop for font in '("Microsoft Yahei" "Hiragino Sans GB" "Noto Sans Mono CJK SC")
           when (font-installed-p font)
           return (set-fontset-font t '(#x4e00 . #x9fff) font)))