读了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也是回溯引擎——而是精确到源码里的哪一行、哪一个数据结构、哪一个设
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2496972.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!