我有一个由linux uuid generation代码(libc)生成的字符串:
1b4e28ba-2fa1-11d2-883f-b9a761bde3fb
我需要替换此字符串中的一些字符:
带有-
的 _
2
f
的{{1}}
4
与x
我正在使用循环生成200 UUID
。
因此,对于每个我需要使用自定义函数替换的uuid,因此必须最大限度地优化函数才能实现,我该如何实现?
答案 0 :(得分:4)
我想你正在使用char[] str
char *c;
for(c = str; *c != '\0'; ++c){
if( *c == '-' ) *c = '_';
else if( *c == '2' ) *c = 'f';
else if( *c == '4' ) *c = 'x';
}
switch
版
char *c;
for(c = str; *c != '\0'; ++c){
switch(*c){
case '-': *c = '_'; break;
case '2': *c = 'f'; break;
case '4': *c = 'x'; break;
}
}
答案 1 :(得分:4)
你想要的东西是否像这样微不足道?
void my_replace(char* str)
{
while (*str) {
switch (*str) {
case '-':
*str = '_';
break;
case '2':
*str = 'f';
break;
case '4':
*str = 'x';
break;
default:
break;
}
++str;
}
}
它非常快速而简单。我真的看不出你怎么能让它更快。
编辑:我知道在某些字符串操作中有一些优化,但我不知道它们在这里是如何适用的。例如,在memcpy
的情况下,可以一次复制4个或更多字节,具体取决于处理器。在比较正确对齐的字符串的情况下,比较整数可能是更有效的。我只是看不到适用的技术。
答案 2 :(得分:1)
C库函数可以优化,并且比手动编码迭代速度快得多。
char* uuid; // = ...
// size_t uuid_len; // = ... length of uuid
char* ptr = strpbrk(uuid, "-24");
while (ptr)
{
switch(*ptr)
{
case '-':
*ptr = '_';
break;
case '2':
*ptr = 'f';
break;
case '4':
*ptr = 'x';
break;
}
// if (ptr-uuid == uuid_len) break;
ptr = strpbrk(ptr+1, "-24");
}
编辑:根据看似不必要的示例here进行范围检查。
编辑:所以我决定在这里测试3种算法,看看哪种更快。我在2006年的Mac Pro上有一个100000字符串的循环,用gcc编译,-O3。我平均进行了1000次运行并进行了5次循环。
@johnchen由发,平均时间为7.85ms。
......和strpbrk
在32毫秒处遥遥领先。 (很高兴我用“可能”,“可能”等等对我的所有优化声明进行了限定。)
编辑:与Clang有很大的不同 - j @ WY的算法在Clang下占用10ms(看起来与它们相关),我的算法没有变化。