如何在C中以有效的方式替换字符串

时间:2013-04-20 03:18:51

标签: c linux gcc libc

我有一个由linux uuid generation代码(libc)生成的字符串:

1b4e28ba-2fa1-11d2-883f-b9a761bde3fb

我需要替换此字符串中的一些字符:

带有-

_
2 f的{​​{1}} 4x

。{

我正在使用循环生成200 UUID

因此,对于每个我需要使用自定义函数替换的uuid,因此必须最大限度地优化函数才能实现,我该如何实现?

3 个答案:

答案 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。

@YongweiWu落后平均时间为7.89ms。差异看起来很重要;不幸的是,进入并进行适当的统计测试不会在今晚发生。 :)

......和strpbrk在32毫秒处遥遥领先。 (很高兴我用“可能”,“可能”等等对我的所有优化声明进行了限定。)

编辑:与Clang有很大的不同 - j @ WY的算法在Clang下占用10ms(看起来与它们相关),我的算法没有变化。