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

Why is strlen() about 20 times faster than manually looping to check for null-terminated character?

最初的问题收到的反馈很差,很多人投反对票。所以我想我会修改这个问题,让它更容易阅读,并希望对看到它的人有更多帮助。最初的问题是为什么 strlen() 比手动循环字符串并找到 '\0' 字符快 20 倍。我认为这个问题是有根据的,因为我在任何地方都读过 strlen()'s technique to find the string length is essentially looping until it finds a null-terminating character '\0'。这是对 C 字符串的普遍批评,原因不止一个。正如许多人指出的那样,作为 C 库一部分的函数是由聪明的程序员创建的,以最大限度地提高性能。

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

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