【发布时间】:2011-09-05 00:53:14
【问题描述】:
我有这个代码(我的 strlen 函数)
size_t slen(const char *str)
{
size_t len = 0;
while (*str)
{
len++;
str++;
}
return len;
}
做while (*str++),如下图,程序执行时间要大很多:
while (*str++)
{
len++;
}
我这样做是为了探测代码
int main()
{
double i = 11002110;
const char str[] = "long string here blablablablablablablabla"
while (i--)
slen(str);
return 0;
}
在第一种情况下,执行时间约为 6.7 秒,而在第二种情况下(使用*str++),时间约为 10 秒!
为什么差别这么大?
【问题讨论】:
-
为什么使用双精度而不是无符号长整数?此外,您应该尝试在没有优化的情况下进行编译并查看结果。哦,你应该同时运行大约 20 次并计算平均持续时间。
-
分支预测失败?不必要的数据副本?尝试查看生成的程序集。另外,请尝试开启优化,它可能会解决问题。
-
您使用哪种编译器?我用我的 gcc 4.4.5 运行它,它们几乎需要相同的时间,大约 2 秒。将 i 设置为 110021100,它们都使用大约 19 秒。
-
所以这取决于我猜使用的是哪个编译器。 (我在 gcc 编译器中使用代码块)
-
if (*str) do { ... } while (*++str);呢?