记录我第一次为 GNU/Emacs 提交代码的经历

记录我第一次为 GNU/Emacs 提交代码的经历

💡 原文英文,约600词,阅读约需2分钟。
📝

内容提要

最近,我在Emacs中打开大量缓冲区时,发现切换标签变得缓慢。经过性能分析,发现问题出在tab-line-tabs-fixed-window-buffers函数中,使用seq-position导致O(N^2)的时间复杂度。为此,我通过缓存列表索引在哈希表中优化了该函数,显著提高了性能。该补丁已提交并确认,将在GNU/Emacs 31.0.51版本中包含,这是我首次为GNU/Emacs贡献代码。

🔎

延伸解读

性能瓶颈的根源

文章指出,当Emacs打开大量缓冲区时,tab-line切换缓慢的根源在于tab-line-tabs-fixed-window-buffers函数中使用了seq-position。该函数在排序过程中为每个缓冲区查找其在旧列表中的位置,而seq-position需要线性遍历列表,导致整体时间复杂度达到O(N^2)。性能分析显示,seq-position占用了约63%的CPU时间,这解释了为何缓冲区数量增多时卡顿明显。

优化思路:空间换时间

作者通过引入哈希表缓存缓冲区索引来优化。具体做法是遍历旧缓冲区列表,将每个缓冲区及其索引存入哈希表,之后在排序时直接从哈希表获取位置,将查找时间降为常数级。这样,排序的总体复杂度从O(N^2)降至O(N log N),即使缓冲区数量很大,切换标签也能保持流畅。这种空间换时间的策略在性能优化中很常见。

补丁的接纳与版本

该补丁提交到bug-gnu-emacs邮件列表后,被上游维护者确认为正确的修复,并将包含在GNU/Emacs 31.0.51版本中。这是作者首次为GNU/Emacs贡献代码,标志着其改进被官方认可。文章还提到Richard Stallman曾评论该线程,但后来表示是误操作,这为经历增添了一段小插曲。

❓

Q&A

在Emacs中遇到的性能问题是什么?

在Emacs中打开大量缓冲区时,切换标签变得缓慢,主要是由于tab-line-tabs-fixed-window-buffers函数中的seq-position导致O(N^2)的时间复杂度。

如何优化Emacs中的tab-line-tabs-fixed-window-buffers函数?

通过缓存列表索引在哈希表中优化该函数,从而显著提高了性能。

我如何提交代码到GNU/Emacs?

在解决问题后,可以将补丁提交到bug-gnu-emacs,经过确认后将会包含在后续版本中。

这个补丁将在哪个版本的GNU/Emacs中包含?

该补丁将包含在GNU/Emacs 31.0.51版本中。

我第一次为GNU/Emacs贡献代码的经历如何?

这是我首次为GNU/Emacs贡献代码,得到了维护者的确认,感到非常兴奋。

Richard Stallman对我的补丁有什么评论?

Richard Stallman在我的讨论中评论了我的补丁,但后来表示那是个错误。

🏷️

标签

➡️

继续阅读