gpt4 book ai didi

c++ - 为什么 strlen() 比手动循环检查空终止字符快大约 20 倍?

转载 作者:行者123 更新时间:2023-11-30 20:45:54 32 4
gpt4 key购买 nike

最初的问题反响不佳,并得到了很多反对票。所以我想我应该修改这个问题,使其更容易阅读,并希望对看到它的人有更多帮助。最初的问题是为什么 strlen() 比手动循环字符串并查找 '\0' 字符快 20 倍。我认为这个问题是有根据的,因为我在任何地方读到 strlen() 查找字符串长度的技术本质上都是循环的,直到找到空终止字符 '\0'。这是对 C 字符串的常见批评,原因不止一个。正如许多人指出的那样,C 库中的函数是由聪明的程序员创建的,旨在最大限度地提高性能。

感谢 ilen2,他为我提供了一种非常聪明的方法,使用按位运算符一次检查 8 个字节,我设法得到了一些东西,在大于大约 8 到 15 个字符的字符串上,运行速度比 strlen() 更快,当字符串相当大时,比 strlen() 快很多倍。例如,奇怪的是, strlen() 似乎与要完成的字符串的长度呈线性时间相关。另一方面,无论字符串长度如何,自定义字符串都花费几乎相同的时间(我测试了最多几百个)。不管怎样,我的结果相当令人惊讶,我在关闭优化的情况下完成了这些结果,我不知道它们的有效性。非常感谢 ilen2 提供的链接和 John Zwinck。有趣的是,John Zwinck 建议使用 SIMD 作为 strlen() 更快的可能性,但我对此一无所知。

最佳答案

strlen() 是一个非常受欢迎的函数,您可以打赌,一些非常聪明的人花了几天甚至几个月的时间来优化它。一旦你的算法正确,接下来的事情就是,你能一次检查多个字节吗?答案当然是可以,使用 SIMD (SSE) 或其他技巧。如果您的处理器一次可以运行 128 位,则每个时钟运行 16 个字符,而不是 1 个。

关于c++ - 为什么 strlen() 比手动循环检查空终止字符快大约 20 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37370060/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com