Emacs内存占用恐怖,怎么处理.savehist-printable,ivy-posframe--read 下占用挺高

只用org-mode没编译任何东西,为什么占用了差不多7G内存,还在不停增长.

  • savehist-printable 29,798,100,953 98% 自动保存占用这么恐怖?

  • timer-event-handler 29,810,292,785 99%
  • apply 29,810,163,017 99%
  • savehist-autosave 29,798,559,773 98%
  • savehist-save 29,798,539,885 98% + savehist-printable 29,798,100,953 98% generate-new-buffer 2,096 0% + #<compiled 0x7561e249> 1,056 0%
  • which-key–update 6,533,285 0%
  • tooltip-timeout 3,778,936 0%
  • command-execute 13,430,263 83%
  • call-interactively 13,429,207 83%
  • funcall-interactively 13,429,207 83%
  • counsel-M-x 9,847,848 61% - ivy-read 9,663,016 60%
    • apply 9,663,016 60%
    • ivy-posframe–read 9,661,960 60%
    • apply 9,661,960 60%
    • #<compiled 0x1223a635> 9,661,960 60% + ivy-call 7,472,378 46% + read-from-minibuffer 1,811,476 11% + ivy–reset-state 283,252 1% + #<compiled 0x74f966f9> 15,714 0% + ivy–update-prompt 1,024 0%
`- command-execute                                          13,430,263  83%
  • call-interactively 13,429,207 83%
  • funcall-interactively 13,429,207 83%
  • counsel-M-x 9,847,848 61% - ivy-read 9,663,016 60%
    • apply 9,663,016 60%
    • ivy-posframe–read 9,661,960 60%
    • apply 9,661,960 60%
    • #<compiled 0x1223a635> 9,661,960 60% - ivy-call 7,472,378 46%
      • counsel-M-x-action 7,472,378 46%
      • command-execute 7,472,378 46%
      • call-interactively 7,472,378 46%
      • funcall-interactively 6,662,671 41% - profiler-report 6,661,623 41%
        • profiler-report-memory 1,578,444 9%
        • profiler-report-profile-other-window 1,578,444 9%
        • switch-to-buffer-other-window 1,143,353 7%
        • profiler-report-setup-buffer 435,091 2%
        • profiler-report-cpu 1,288,451 8% profiler-start 1,048 0%
      • byte-code 809,675 5%`

停用posframe相关包解决问题,不知道bug在哪里

我也觉得,用了ivy-posframe后counsel-projectile-rgcounsel-rg会很卡,特别是增量搜索的时候卡顿很明显,非常不流畅 :sweat: 但是我有习惯了把completion的窗口放到屏幕中央了,不知道有什么好的解决方法

用snail?

有想过,但是貌似跟posframe有关,counsel-rg本身很流畅,所以不知道还snail会不会有帮助

我最近也在看posframe的性能问题,这个得请教下 @tumashu 是怎么回事了。

我之前报了一个issue:

1 个赞

这个是 ivy-posframe 导致的问题,还是 posframe 的问题?

我有空尝试看一下,具体是 posframe 还是 ivy-posframe 的问题真不好说。我只有 ivyhydra 用了 posframe。hydra的内容太小而且是固定的,没有感觉到性能问题。但是ivy输入的时候卡顿非常明显。

我猜测是posframe。仔细观察会发现,不管哪个与posframe相关的包第一次启用内存都会上升不少,几兆到几十兆不等。ivy-posframe是使用最频繁,内存占用也是最多的。

如果能搞出一个简单的性能测试用例就好了,用二分法也能找到瓶颈。

如果可以的话,最好用 emacs -Q 测试一下 ivy-posframe, 看看有没有性能问题,也许是和某些包冲突了。

估计是和某些包冲突,我最近重新构建了整个ini.el ,也使用了porframe和ivy这些插件,到目前未重新出现这种情况,内存占用几百M.

另,pyim现在有双拼适合的词库吗?默认的basic.dict常用词都打不出了,还有M-x装不了greatdict的包了,用中科大的源.

双拼用全拼得词库,你可以用pyim-dict-manager添加词库文件,看看readme吧,有些介绍

greatdict已经不在melpa了,版权问题

今天看代码,突然想到ivy-posframe是自己单独创建了一个buffer处理,能否直接复用minibuffer呢?这样是否能减少内存和CPU占用从而提高性能?

mini-frame直接接管了read-from-minibuffer,所以所有的命令都可接管,除了ivy还包括icomplete、eval-expression、yes-or-no messages等。

这个倒是没有研究过

最早看见 mini-frame 的时候,我还和维护者提了一嘴,可以复用 posframe,不过作者没这个意思,本人英语水平也不咋地,也就不了了之了,当时我以为 mini-frame 准备直接使用 child-frame 来获取焦点,我觉得不太可靠,刚刚看了一下它的代码,发现它好像默认也是使用 mini-buffer 来获取焦点,只用 child-frame 来显示,可能和 ivy-posframe 使用类似的思路了。

再请教一个问题,如何让child frame失去焦点后自动隐藏?使用ivy-posframe的时候经常会遇到,无意间切换或者点到其他窗口,但是child frame仍然显示,很是别扭。就像这样,焦点其实在下面的窗口中。

我尝试的添加了这个功能,你可以试试

2 个赞