读了libstdc++的regex源码,找到了C++标准库慢100倍的5个根因

张开发
2026/5/5 0:55:00 15 分钟阅读
读了libstdc++的regex源码,找到了C++标准库慢100倍的5个根因
很多写C++的人心里有个默认假设:标准库的东西,性能就算不是最优,至少不会太差。毕竟C++的卖点就是性能,标准委员会和标准库维护者不可能在这件事上翻车。这个假设在大多数组件上成立。std::sort比手写快排更稳健,std::unordered_map大多数场景够用,std::vector的内存布局几乎就是教科书最优解。但有一个例外——它不是"不够快",而是慢到让人怀疑自己编译选项写错了。std::regex。写一段最简单的邮箱匹配,std::regex跑一遍,Python的re跑一遍,你会发现C++这边的耗时大约是Python的50到100倍。没写错,不是C++快100倍,是C++慢100倍。一个编译型语言,在正则匹配这件事上,被一个解释型语言按在地上摩擦。第一反应肯定不信。然后你去查编译选项,确认开了-O2;把std::regex对象提出来复用,确认没有重复编译正则;怀疑是不是测试方法有问题,换了三种计时方式。最后发现,数字就是这么难看。不是你的问题,是std::regex本身的问题。这篇文章要做的事很直接:打开GCC 14的libstdc++源码,从正则编译到NFA构造,从匹配执行到状态管理,把std::regex慢的根因一层一层拆出来。不是笼统地说"它用了回溯"——回溯引擎不一定慢,Python的re也是回溯引擎——而是精确到源码里的哪一行、哪一个数据结构、哪一个设

更多文章