【发布时间】:2014-03-06 11:09:08
【问题描述】:
我们的讲师已经解释了这个计算字符串长度的函数......
int strlen_1(const char *str) {
const char *temp = str;
while(*temp != '\0') {
temp++;
}
return temp - str;
}
...会比这个更快...
int strlen_03(const char *str) {
int i;
for (i = 0; *(str+i) != '\0'; i++);
return i;
我认为他说这与算术计算有关,就像在第一个中所做的任何算术演算一样,但我无法理解,我认为它们处于同一水平。能否请您换句话解释一下原因?
PS。我确实理解指针,也能理解发生了什么,这就像将存储在“RAM 单元”中的数组元素逐个单步执行。
提前致谢。
【问题讨论】:
-
PS:微优化是个坏主意。如果你有性能问题,首先找出它使用最多 CPU 的地方
-
开启优化并查看生成的程序集以清楚了解它们的不同之处。
-
如果你的老师是正确的,那是因为第二个做了两个加法,而第一个只做了一个。然而,正如 chris 和 Ed Heal 所提到的,在您分析代码并发现实际的性能问题之前,担心这种级别的手动优化通常是没有意义的。无论如何,在优化代码中生成的程序集很可能是相同的。
-
顺便说一句,虽然这个问题可能与 C 相当相关,但在 C++ 中,一个简单的
your_string.length()通常会比上述任何一个都快得多,因为它是 O(1) 而不是 O(N )。 -
重要的是循环内部的内容(包括 for 和 while 中的测试和更新部分)。第二个循环有两个添加,但第一个循环只有一个。
标签: c++ performance function pointers string-length