2016-05-22 27 views
-4

原来的问题被糟糕的收到,并得到许多downvotes。所以我想我会修改这个问题,让它更容易阅读,并希望对任何看到它的人有更多的帮助。最初的问题是为什么strlen()比手动循环查找字符串并找到'\ 0'字符的速度快20倍。我认为这个问题是有根据的,因为我读过strlen()的技术来查找字符串长度本质上是循环的,直到找到一个空终止字符'\ 0'。这是对C字符串的一种常见批评,其原因不止一个。正如很多人指出的那样,作为C库一部分的函数是由智能程序员创建的,以最大限度地提高性能。为什么strlen()比手动循环检查以空字符终止字符快20倍?

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

+1

您的字符计数实现使用每循环两个加法。我可以想出一种方法,只使用1个方法。 – ilent2

+5

一个是对优化库的库调用,另一个是未经优化的程序集的一部分,而不是最优化的算法?这就像问:“为什么使用烤箱更快地把鸡蛋放在冰箱旁边的包里?” – Yakk

+3

我也期待与最佳化开启编译器可能能够确定计算字符串的长度可以在编译时完成,所以这不是一个最好的例子。一个更好的例子可能是首先将不同长度的字符串加载到内存中(从文件或其他地方),然后确定它们的长度。 – ilent2

回答

5

strlen()是一个非常重击功能,你可以打赌,一些非常聪明的人花了几天和几个月对其进行优化。一旦你的算法正确,接下来的事情是,你能一次检查多个字节吗?答案当然是,你可以使用SIMD(SSE)或其他技巧。如果您的处理器可以同时对128位进行操作,这是每时钟16个字符,而不是1

+0

我写了一些基于ilent2提供的链接,它一次检查8个字节,至今检测速度比strlen()快4倍,我非常高兴,但还有更多工作要做。使用SIMD会很有趣,我不知道如何使用它。 – Zebrafish