【发布时间】:2013-12-15 21:35:55
【问题描述】:
我正在执行 strchr 并尝试优化我的代码以使用我机器的 64 位属性。因此,我将字符串转换为长整数,从而一次比较 8 个字符。
目前,我有:
int has_char(unsigned long word, unsigned long c)
{
if((word & 0xFF00000000000000) == (c << 56) ) return (1);
if((word & 0x00FF000000000000) == (c << 48)) return (1);
if((word & 0x0000FF0000000000) == (c << 40)) return (1);
if((word & 0x000000FF00000000) == (c << 32)) return (1);
if((word & 0x00000000FF000000) == (c << 24)) return (1);
if((word & 0x0000000000FF0000) == (c << 16)) return (1);
if((word & 0x000000000000FF00) == (c << 8)) return (1);
if((word & 0x00000000000000FF) == c) return (1);
return (0); /* Not found, returning 0 */
}
char strchr(const char *s, int c)
{
const char *curr;
const long *str;
unsigned long wd;
str = (long *)s;
while (1) {
wd = *str;
if (has_char(wd, (unsigned long)c)) {
curr = (char *)str;
while (*curr) {
if (*curr == (char)c)
return ((char *)curr);
curr++;
}
}
if ((wd - 0x0101010101010101)
& ~wd & 0x8080808080808080) /* End of string and character not found, exit */
return (NULL);
str++;
}
}
效果很好,但我的 has_char 效率很低,它测试了 8 次字符值。有没有办法做一个独特的测试(掩码?)如果字符出现在单词中则返回 1,如果不存在则返回 0?
感谢您的帮助!
【问题讨论】:
-
您已经在循环结束时进行了每字节空测试。只需从 c
-
看SSE指令集
-
如果字符串长度不是 8 的倍数,您的代码将无法正常工作。在某些平台上,
long必须在 8 字节边界上对齐,因此您不能转换任何 @ 987654323@ 到unsigned long *。 -
嗯,如果我超出 8 字节边界会发生什么?分段故障 ?我的电脑没有抱怨……嗯,还没有?
标签: c micro-optimization