最初的问题得到了很严重的接受,并得到了许多支持。所以我认为我会修改这个问题,以便更容易阅读,并希望能够为任何看到它的人提供更多帮助。最初的问题是为什么strlen()比手动循环字符串并找到'\ 0'字符要快20倍。我认为这个问题是有根据的,因为在任何地方我都会读到strlen()找到字符串长度的技术本质上是循环的,直到它找到一个空终止字符'\ 0'。这是对C字符串的常见批评,原因多于一个。正如许多人所指出的那样,作为C库一部分的函数是由智能程序员创建的,以最大限度地提高性能。
感谢ilen2,他将我与一个非常聪明的方法联系使用按位运算符一次检查8个字节,我设法得到一些东西,大于约8到15个字符的字符串比strlen()运行得快,当字符串相当大时,比strlen()快很多倍。例如,奇怪的是,strlen()似乎是线性时间依赖于要完成的字符串的长度。另一方面,无论字符串长度(我测试了几百个),自定义的时间几乎相同。无论如何,我的结果是相当令人惊讶的,我做了他们优化关闭,我不知道他们是多么有效。非常感谢ilen2的链接和John Zwinck。有趣的是,John Zwinck建议SIMD可能为什么strlen()可能更快,但我对此一无所知。
答案 0 :(得分:5)
strlen()
是一个非常重要的功能,你可以打赌,几个非常聪明的人花了几天和几个月来优化它。一旦你的算法正确,接下来就是,你能一次检查多个字节吗?答案当然是你可以使用SIMD(SSE)或其他技巧。如果您的处理器一次可以运行128位,则每个时钟16个字符而不是1个。