C 在64位计算机上评测集合实现

C 在64位计算机上评测集合实现,c,C,有关我的系统的相关信息: Core2Duo T6500 gcc(gcc)4.4.1 20090725(红帽4.4.1-2) 使用基本集合实现,其中存储的每个集合实际上只是所存储集合的字典顺序,您可以对集合操作(如并集、交集、elementQ等)使用标准位操作 我的问题是关于确定集合的大小。像使用 存储任何给定的8位字符串中有多少位,然后算法将一次通过8位来确定集合的大小 我有两个问题: 如果寄存器比缓存或RAM快8倍以上,这将浪费速度 在64位计算机中,int操作的速度不比我假设的64位CPU上

有关我的系统的相关信息: Core2Duo T6500 gcc(gcc)4.4.1 20090725(红帽4.4.1-2)

使用基本集合实现,其中存储的每个集合实际上只是所存储集合的字典顺序,您可以对集合操作(如并集、交集、elementQ等)使用标准位操作

我的问题是关于确定集合的大小。像使用

存储任何给定的8位字符串中有多少位,然后算法将一次通过8位来确定集合的大小

我有两个问题:

  • 如果寄存器比缓存或RAM快8倍以上,这将浪费速度
  • 在64位计算机中,
    int
    操作的速度不比我假设的64位CPU上的标准操作整数慢
  • 但我可以想象,仅仅使用一个简单的

    while(x)
      x&=x-1;
      ++count;
    
    可以更快,因为所有内容都可以存储在寄存器中。但在不利的方面,除了明显的8倍操作之外,还有什么其他的方法吗

    另外,有很多不同的
    int、uint、unsigned long、unsigned long long
    组合,我不知道从哪里开始测试

    你知道关于这个话题的文章吗

    你知道关于这个话题的其他问题吗

    你对此有什么见解吗

    你对如何描述这一点有什么建议吗?我从未使用过gprof。当我使用time.h时,我不能得到比一秒更精细的粒度


    如果您这样做,我将不胜感激。

    我将使用随机数生成器分析两种不同的实现,以创建位模式。我会在多次迭代中循环,在每次迭代中积累一些东西(例如,位计数的异或),我会在循环结束时打印出来。积累和打印是必要的,这样编译器就不会优化掉任何重要的东西。

    最有可能(尽管我现在懒得测试),最快的可能是

    int popcount(unsigned x) {
        int count;
    #if defined(__GNUC__)
        __asm__("popcnt %1,%0" : "=r" (count) : "r" (x));
    #elif defined(_MSC_VER)
        __asm {
            POPCNT x, count
        };
    #else
        /* blah, who cares */
        for (count = 0; x; count += x&1, x >>= 1);
    #endif
        return count;
    }
    
    (虽然如果CPU不支持SSE4.2,这会爆炸。)当然,使用编译器的内置内部函数会更好(并且更具可移植性),一般来说,我相信编译器会选择最适合当前目标平台的实现

    int popcount(unsigned x);
    #if defined(__GNUC__)
    # define popcount __builtin_popcount
    #elif defined(_MSC_VER)
    # define popcount __popcnt
    #else
    /* fallback implementation */
    #fi
    

    非常感谢你,我从来不知道popcnt是我要找的。
    int popcount(unsigned x);
    #if defined(__GNUC__)
    # define popcount __builtin_popcount
    #elif defined(_MSC_VER)
    # define popcount __popcnt
    #else
    /* fallback implementation */
    #fi