0

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

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

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

-_
2f
4x

我正在UUID使用循环生成 200 s。

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

4

3 回答 3

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 个或更多字节,具体取决于处理器。在比较正确对齐的字符串的情况下,比较整数可能是可能的并且更有效。我只是看不到适用的技术。

于 2013-04-20T04:05:05.923 回答
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;
    }
}
于 2013-04-20T03:34:31.990 回答
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");
}

编辑:根据此处似乎没有必要的示例,取出范围检查。

编辑:所以我决定在这里测试这 3 种算法,看看哪个更快。我有一个 100000 个字符串的循环,在一台老式的 2006 Mac Pro 上,用 gcc,-O3 编译。我平均跑了 1000 次,做了 5 个循环。

最终获胜者是...

@johnchen平均时间为 7.85 毫秒。

@YongweiWu 以 7.89 毫秒的平均时间紧随其后。差异看起来很大;不幸的是,今晚不会进行适当的统计测试。:)

......strpbrk在 32 毫秒时是遥远的三分之一。(很高兴我用“可能”、“可能”等来限定我所有的优化声明......)

编辑:Clang 有很大的不同--j @ WY 的算法在 Clang 下需要 10 毫秒(看起来它们之间并列),我的没有改变。

于 2013-04-20T03:46:01.237 回答