惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
罗磊的独立博客
S
SegmentFault 最新的问题
D
Docker
博客园 - 司徒正美
雷峰网
雷峰网
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - Franky
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
MyScale Blog
MyScale Blog
MongoDB | Blog
MongoDB | Blog

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日
读:编译高性能 Emacs - 暗无天日
2026-05-16 · via 暗无天日

这一步在编译 Emacs 之前 做,因为 Native Compiler 的配置写在 early-init.el 里,编译完第一次启动 Emacs 时它会用这些参数来编译所有 .el 文件。

先查你的 CPU 架构代号:

gcc -march=native -Q --help=target | grep march

输出类似:

-march=		skylake

ARM 设备输出类似:

-march=		armv8-a+crypto+crc

armv8-a 是 ARM 64 位基础指令集, +crypto 是加密扩展(硬件加速 AES、SHA 等), +crc 是 CRC32 校验扩展。 + 号是 GCC 的语法,表示在基础架构上启用可选扩展。

记住你查到的架构代号。

然后在 ~/.emacs.d/early-init.el 里加上(Emacs 27+ 才有这个文件,没有就新建一个):

(setq my-cpu-architecture "skylake") 
(setq native-comp-compiler-options
      `(        "-O2"
                ,(format "-mtune=%s" my-cpu-architecture)
        ,(format "-march=%s" my-cpu-architecture)
                "-g0"
                "-fno-omit-frame-pointer"
                "-fno-finite-math-only"))

*ARM 用户注意*:ARM 上 -march-mtune 接受的值不同。 -march 接受架构字符串(如 armv8-a+crypto+crc ),但 -mtune 要传具体 CPU 名称(如 cortex-a72 ),不能用同一个值。查 -mtune 值的命令:

gcc -mtune=native -Q --help=target | grep mtune

ARM 用户的配置要分开设置:

(setq my-cpu-architecture "armv8-a+crypto+crc") (setq my-cpu-tune "cortex-a72")                  
(setq native-comp-compiler-options
      `("-O2"
        ,(format "-march=%s" my-cpu-architecture)
        ,(format "-mtune=%s" my-cpu-tune)
        "-g0"
        "-fno-omit-frame-pointer"
        "-fno-finite-math-only"))

(setq native-comp-driver-options
      '(        "-Wl,-z,pack-relative-relocs"
                "-Wl,-O2"
                "-Wl,--as-needed"))

几个要点:

  • 不要用 nativemarch 的值 。libgccjit(负责 native compilation 的库)不能像独立 GCC 那样自动探测主机 CPU,传 native 可能导致编译失败。必须手动查到架构代号再填。
  • -O2 而不是 -O3 。Emacs 开发者明确建议不要用 -O3 ,因为它在 Emacs 这种大型老旧 C 代码库上可能触发未定义行为,导致随机崩溃或界面卡死。
  • -g0 去掉调试符号。 .eln 文件不需要调试,去掉后文件更小、编译更快。
  • -fno-omit-frame-pointer 保留栈帧指针。虽然省掉栈帧指针能腾出一个通用寄存器,但在现代 CPU 上性能提升微乎其微,反而会让崩溃时的栈回溯变得难以阅读(Emacs 开发者 Eli Zaretskii 在 bug#76180 中也指出了这个问题)。

改完配置后,需要清掉旧的 .eln 缓存让 Emacs 用新参数重新编译:

find ~/.emacs.d/ -name '*.eln' -delete

下次启动 Emacs 时,Native Compiler 会在后台自动用新参数重新编译所有 .el 文件。不用手动触发,Emacs 加载包时发现缺 .eln ,自己就会起后台线程编译。