Emacs 26.1のc-modeのシンタックスハイライトが重いでござる(未解決)

EmacsでC++を書いてるとバッファが超重くなることがある。キー入力やスクロールがツーテンポくらい遅れる感じ。他のバッファには影響しないので物凄く困ってるわけではないが、地味にストレスでござる。

発生条件がさっぱりわからんのが困りどころ。重くなるファイルでも開いた直後は大丈夫だったりして、編集しているうちに何かの拍子で重くなる。ファイルの大きさ自体はさほど関係ないようだ(起きないやつは行数が多くても起きないし、起きるやつは100行程度のソースでも起きる)。何となく、コメントないしマルチバイト文字成分多めのファイル、C++11なコードで発生しやすいような感じ。

ほぼ間違いないのはc-modeが原因であるということ。他のmodeでは発生しないし…。恐らくFont Lockがらみが原因と思われる

(2019-07-09 追記)
M-x font-lock-modeでFont Lockの有無を切り替えると明らかに速度が変わるので、Font Lockがらみなのも間違いない。

未だ解決には至ってないが、毎度profileとるのが面倒なのでメモがてら記事にしとく。

Function                                                  CPU samples    %
- redisplay_internal (C function)                                 736  68%
 - jit-lock-function                                              731  68%
  - jit-lock-fontify-now                                          731  68%
   - jit-lock--run-functions                                      725  67%
    - run-hook-wrapped                                            725  67%
     - #<compiled 0x1b94275>                                      725  67%
      - font-lock-fontify-region                                  725  67%
       - c-font-lock-fontify-region                               722  67%
        - font-lock-default-fontify-region                        658  61%
         - font-lock-fontify-keywords-region                      647  60%
          - c-font-lock-declarations                              320  29%
           - c-find-decl-spots                                    313  29%
            - #<compiled 0x1c22bc1>                               234  21%
             - c-get-fontification-context                        125  11%
              - c-back-over-member-initializers                    64   5%
               + c-just-after-func-arglist-p                       18   1%
               + c-parse-state                                     16   1%
               + c-back-over-compound-identifier                   14   1%
               + c-at-toplevel-p                                   10   0%
               + c-backward-sws                                     5   0%
              + c-looking-at-or-maybe-in-bracelist                 47   4%
              + c-backward-token-2                                  6   0%
              + c-back-over-compound-identifier                     3   0%
             + c-forward-decl-or-cast-1                            60   5%
             + c-font-lock-single-decl                             15   1%
             + c-backward-sws                                      14   1%
             + c-backward-token-2                                   4   0%
               c-syntactic-re-search-forward                        2   0%
             + c-forward-label                                      1   0%
            + c-bs-at-toplevel-p                                   52   4%
            + c-beginning-of-macro                                  5   0%
            + c-forward-sws                                         3   0%
            + c-literal-start                                       1   0%
            c-font-lock-<>-arglists                                77   7%
          + #<compiled 0x1c2637d>                                  44   4%
          + c-font-lock-cut-off-declarators                        41   3%
          + c-font-lock-enclosing-decls                            34   3%
          + c-font-lock-enum-body                                  24   2%
            #<compiled 0x1c26351>                                  19   1%
          + c-font-lock-complex-decl-prepare                       11   1%
          + c-font-lock-enum-tail                                   8   0%
            #<compiled 0x1c272e7>                                   8   0%
          + c-font-lock-invalid-single-quotes                       7   0%
            #<compiled 0x1c272af>                                   6   0%
            #<compiled 0x1c2631b>                                   6   0%
            #<compiled 0x1c27285>                                   4   0%
            #<compiled 0x1c2633d>                                   4   0%
            #<compiled 0x1c263a3>                                   4   0%
            #<compiled 0x1c2630b>                                   3   0%
          + c-font-lock-raw-strings                                 3   0%
            whitespace-trailing-regexp                              1   0%
         + font-lock-fontify-syntactically-region                   7   0%
         + font-lock-unfontify-region                               1   0%
        + c-before-context-fl-expand-region                        64   5%
 + file-remote-p                                                    4   0%
 + eval                                                             1   0%
- ...                                                             232  21%
   Automatic GC                                                   232  21%
+ command-execute                                                 103   9%

御覧の通り、c-modeのFont Lockが原因なのは間違いないんだよなー。解決方法分からんけど。

以前はそれほど気にならなかったし設定も大して変えてないので、単にマシンがしょぼいだけって線も捨てきれない。一応マシンスペックも書いておく。

CPU Core i5-5200U (2.2GHz/2C4T)
RAM DDR3-1600 8GBx1
GPU HD Graphics 5500
HDD MQ01ABF050

前はUnreal Engine 4での開発に耐えられるようなデスクトップマシンだったのよねー。