【发布时间】:2012-07-16 08:58:01
【问题描述】:
我决定找出两个函数的速度:
- strcmp - string.h中定义的标准比较函数
- xstrcmp- 一个具有相同参数并执行相同操作的函数,只是我创建的。
这是我的 xstrcmp 函数:
int xstrlen(char *str)
{
int i;
for(i=0;;i++)
{
if(str[i]=='\0')
break;
}
return i;
}
int xstrcmp(char *str1, char *str2)
{
int i, k;
if(xstrlen(str1)!=xstrlen(str2))
return -1;
k=xstrlen(str1)-1;
for(i=0;i<=k;i++)
{
if(str1[i]!=str2[i])
return -1;
}
return 0;
}
我不想依赖 strlen,因为我想要用户定义的所有内容。
所以,我找到了结果。 strcmp 每毫秒进行 364 次比较,而我的 xstrcmp 每毫秒只进行 20 次比较(至少在我的计算机上!)
谁能说出为什么会这样? xstrcmp 函数做了什么让自己这么快?
【问题讨论】:
-
"does the same" 不准确...如果字符串的长度不同,它返回-1?此外,你的有 3 个
strlen()调用,它们是 O(n)。strcmp()不需要任何strlen()调用。 -
“因为我想要所有用户定义的东西。”学习它很好,但不要仅仅为了它而重新实现现有的方法。
-
许多编译器
strcmp和strcpy都是手动优化的,并且会生成非常紧凑的内联代码。 -
有人将 GNU 版本复制到此论坛帖子中:compsci.ca/v3/viewtopic.php?t=24383(第 3 篇帖子)
-
@c.adhityaa - 这是highly-optimized gnu-strlen 函数。来自评论: 我们将一次测试一个长字,而不是测试每个字符的传统循环。棘手的部分是测试 所讨论的长字中的四个 字节是否为零。
标签: c++ c performance compare strcmp