文章摘要
作者在尝试多种编程语言后,决定解决长期困扰的Emacs在MacOS上的性能问题。尽管尝试了多种构建和配置,Emacs仍在使用过程中内存占用不断增加,最终导致系统冻结。尽管进行了多次调试和性能分析,问题仍未解决,最终通过追踪日志发现了潜在原因。
文章总结
Emacs在MacOS上的性能问题
背景
最近,我在尝试多种编程语言和技术,如Zig、Go、Janet和C集成。尽管本应专注于自己的项目,但生活中的琐事让我不得不寻找一些“快乐的分散注意力”的方式。这些技术的学习让我掌握了一些新技巧,某天我决定解决一个困扰我多年的问题:Emacs在MacOS上的卡顿问题。
无论我尝试哪种构建或配置,Emacs的内存使用量总是不断上升,使用几小时后变得越来越慢,最终完全冻结,只能强制关闭。我阅读了许多关于性能问题的抱怨,并尝试了各种调试技术,但始终无法让Emacs在MacOS上的体验接近Linux或Windows。
问题根源
经过深入调查,我发现问题的核心在于[NSApp run]的调用。这个调用启动了主运行循环,处理所有待处理的事件,然后退出。虽然看起来没有问题,但它经常用于处理低级别的系统消息,特别是在ns_select和ns_read_socket中。这些调用在NSAutoreleasePool init中发生,导致每次调用都会重新初始化图形上下文、加载字体和绘制框架,造成大量的内存分配和释放。
由于MacOS的事件处理非常高效,Emacs在短时间内会进行大量的资源分配和释放。然而,某些资源并未被正确释放,导致内存泄漏。MacOS会缓存这些频繁分配的对象,进一步加剧了内存问题。最终,Emacs的性能随着Mac硬件性能的提升而下降。
解决方案
目前,这个问题并不容易解决,因为相关代码已经深深嵌入到系统中。Emacs在MacOS上仍然只使用三个线程(主线程、事件分发线程和文件描述符处理线程),并且严重依赖锁和无限循环。要彻底解决这个问题,需要对事件队列和线程支持进行深度优化。
在调查过程中,我注意到Swift可能是一个潜在的解决方案。Swift提供了更简洁的语法、内置的异步支持、线程安全特性(如Actors)和更高效的内存管理。我设想逐步将MacOS特定的代码迁移到Swift环境中,从而简化代码并提高性能。
总结
Emacs在MacOS上的性能问题源于其与MacOS事件处理机制的复杂交互。虽然目前没有简单的解决方案,但通过深入优化和可能的代码迁移,未来或许能够改善这一状况。Emacs在MacOS上就像一辆被锁住档位的超级跑车,潜力巨大,但尚未完全释放。
- Jank指的是用户界面渲染中的小延迟或无响应。
- nsterm.m包含MacOS(和GNUStep)特定的Objective-C代码。
[NSApp run]是Objective-C中发送run消息给NSApp的语法。- IOSurface用于在OS窗口中渲染Emacs。
评论总结
评论主要围绕Emacs在macOS上的性能问题和用户体验展开,观点多样,既有对问题的批评,也有对解决方案的探讨。
Emacs在macOS上的性能问题
- 用户普遍反映Emacs在macOS上存在性能问题,如内存泄漏、线程挂起等。
- 引用:
- "I recently noticed deleting a frame doesn't seem to free the associated memory" (kkylin)
- "Emacs jank on macos has been slowly killing me" (algo_lover)
解决方案和改进建议
- 一些用户提出了技术解决方案,如使用Jemalloc、改进PGTK前端等。
- 引用:
- "Can't they just use Jemalloc with something similar to LD_PRELOAD under OSX?" (anthk)
- "The PGTK frontend for Emacs... could be further enhanced by adopting a cross-platform, more future-proof SDL toolkit" (rahen)
终端与图形界面的选择
- 部分用户倾向于在终端中使用Emacs,认为图形界面带来了不必要的复杂性。
- 引用:
- "I've always preferred running Emacs in my terminal" (jrockway)
- "Emacs insists that it owns the main loop, while most GUI frameworks insist that they own the main loop" (rayiner)
用户对Emacs的忠诚度与替代选择
- 一些长期用户因性能问题考虑放弃Emacs,转而使用其他编辑器。
- 引用:
- "I am thinking of completely jumping ship after almost a decade of using emacs" (algolover)
- "What will my next editor be? Zed? NeoVim? write my own?" (algolover)
社区贡献与反馈
- 用户对社区贡献表示感谢,并希望更多人参与解决问题。
- 引用:
- "Kind of wish I had the time/energy to help out here" (dwb)
- "The emacs-devel thread is interesting too" (dwb)
总结:Emacs在macOS上的性能问题引发了广泛讨论,用户提出了多种解决方案,但也有人因长期困扰考虑放弃Emacs。社区对问题的关注和贡献是推动改进的关键。