最近,我在浏览Barry Revzin的博客时,注意到C++范围库在过滤或反转与适配器链混合使用时存在效率问题。为了改善这一点,我通过实验开发了一个名为undercurrent的库。其核心思想是一个定制点对象uc::advance_while,该对象通过递归下降迭代器层次结构,而不是在顶层操作。这种方法允许算法在最低迭代器层级执行,从而避免了冗余的谓词评估。
我观察到,在像take_while | transform | filter | reverse这样的适配器链中,性能有了显著提升。在Clang 22 + libc++环境下,相较于std::ranges,我的实现约提升了16倍的速度,而在MSVC下则表现出约2倍的改进。当前库支持一小部分适配器和算法,GCC尚未正常工作,可能与模块相关问题有关。
欢迎大家提供反馈、想法或任何需要考虑的边缘案例!
GitHub链接:undercurrent
Barry Revzin的博客:链接
博主点评: 这个库的设计思路非常巧妙,通过递归下降迭代器来优化性能,展示了C++的灵活性与潜能。面对不同编译器的表现差异,后续的兼容性与适配性将是进一步改进的关键。期待看到更多适配器与算法的支持!