The mask that compiles to nothing: how HotSpots JIT learned to reason about bits22 days agohttps://questdb.com/blog/jvm-jit-known-bits/HotSpot的C2编译器通过追踪已知位与范围来优化位运算。通过证明位未改变,该优化消除了冗余的位与操作,例如移除(x << 2) & -4。系统为每个整数使用两个32位掩码:零位和一位来表示确定的位状态。范围和已知位通过规范化过程相互优化彼此。为AND、OR和移位等操作定义了位传播规则,实现精确分析。该功能在JDK 26中实现并在JDK 27中改进,测试方法确保了正确性。
Your code is fast – if you're lucky16 days agohttps://tiki.li/blog/lucky_code.html现代编译器,特别是 Clang,在使用某些编程风格时,会通过无分支指令来优化循环。一个采用了排序网络和循环展开的快速排序实现,最初比 C++ 标准库的 std::sort 慢。将一段初学者友好的 if 语句改写为紧凑的 C 语言惯用法(使用后置递增运算符)显著提高了性能。这个“外观上”的改动触发 Clang 将分支替换为 csel(条件选择)指令,使代码变为无分支结构。在 x86 架构上,Clang 类似地使用 cmov 指令生成无分支代码,而 GCC 则始终生成较慢的基于分支的版本。优化后的快速排序比原始版本快了超过 6 倍,而且比 std::sort 也快了近一倍。
Dense Arena Interning: The Engine of Compiler Performance15 days agohttps://aikoschurmann.com/blog/string-interning-compilers通过使用稠密竞技场驻留技术减少重复的字符串和结构检查,从而提升编译器性能。稠密竞技场驻留在词法分析或类型构建过程中将字符串和结构转换为稠密整数,使得在后续编译阶段能够实现 O(1) 复杂度的查找与比较。竞技场分配器提供稳定的内存空间,允许基于指针的比较和高效的内存管理,而无需重新分配内存。稠密 ID 支持扁平化的数组符号表,提升缓存局部性,并将符号解析转变为 O(1) 复杂度的数组索引操作。驻留技术将复杂类型规范化,允许通过浅层指针比较替代深层结构检查,从而进一步加快类型与符号比较的速度。
When Compilers Disagree About UTF‑8a day agohttps://nemanjatrifunovic.substack.com/p/when-compilers-disagree-about-utf8一个用于处理UTF-8的开源C++库最初创建时没有进行大量优化。优化集中在ASCII快捷方式:ASCII字符(范围U+0000–U+007F)始终通过UTF-8有效性检查,允许提前返回。一个简单的ASCII快速路径使Clang在纯ASCII文本上的性能提升了三倍,在混合文本上提升了34%。对于相同的优化,GCC在纯ASCII文本上没有变化,而在混合文本上性能下降了3-4%。分析表明,Clang没有消除解码后的检查,而GCC已经优化掉了这些检查。一种改进的方法(在解码函数中内联验证)提高了两个编译器的性能:保留了Clang的增益,并在GCC混合文本上增加了15-20%的提升。教训:编译器行为各异;仔细优化可以带来显著收益。