我有一个由 linux uuid 生成代码(libc)生成的字符串:
1b4e28ba-2fa1-11d2-883f-b9a761bde3fb
我需要替换此字符串中的一些字符:
-
有_
2
有f
4
有x
我正在UUID
使用循环生成 200 s。
因此,对于我需要使用自定义函数替换的每个 uuid,必须最大限度地优化该函数才能做到这一点,我该如何实现呢?
像这样微不足道的事情是你想要的吗?
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 个或更多字节,具体取决于处理器。在比较正确对齐的字符串的情况下,比较整数可能是可能的并且更有效。我只是看不到适用的技术。
我想你正在使用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;
}
}
可以优化 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");
}
编辑:根据此处似乎没有必要的示例,取出范围检查。
编辑:所以我决定在这里测试这 3 种算法,看看哪个更快。我有一个 100000 个字符串的循环,在一台老式的 2006 Mac Pro 上,用 gcc,-O3 编译。我平均跑了 1000 次,做了 5 个循环。
@johnchen的平均时间为 7.85 毫秒。
@YongweiWu 以 7.89 毫秒的平均时间紧随其后。差异看起来很大;不幸的是,今晚不会进行适当的统计测试。:)
......strpbrk
在 32 毫秒时是遥远的三分之一。(很高兴我用“可能”、“可能”等来限定我所有的优化声明......)
编辑:Clang 有很大的不同--j @ WY 的算法在 Clang 下需要 10 毫秒(看起来它们之间并列),我的没有改变。