std::bitset访问效率

当bitset的长度小于64(8个字节)的时候,没有太大效率问题。但足够长的时候就需要考虑了,事实上,当长度大于64的时候会马上突显出来这个问题。

bitset虽然能用位运算,但是当长度较长时把位运算的思想拿过来,还是会有效率问题的。下面代码测试读写的效率,可以根据输出结果判断哪个效率更高。

写:

// Example program
#include <iostream>
#include <bitset>
#include <ctime>
#include <vector>

int main()
{
    static const int BITS = 4096;
    static const std::bitset<BITS> b(1);

    clock_t t1 = clock();
    std::bitset<BITS> a;
    for(int i = 0;i<1000000;i++)
    {
        a[i%BITS] = 1;
    }
    std::cout << clock() - t1 << std::endl;
    
    clock_t t2 = clock();
    std::bitset<BITS> a2;
    for(int i = 0;i<1000000;i++)
    {
        a2 = b<<(i%BITS);
    }
    std::cout << clock() - t2 << std::endl;
    
    clock_t t3 = clock();
    std::bitset<BITS> a3;
    for(int i = 0;i<1000000;i++)
    {
       a3.set(i%BITS, 1);
    }
    std::cout << clock() - t3 << std::endl;
    
    return 0;
}

输出:

1252
100910
0

读:

// Example program
#include <iostream>
#include <bitset>
#include <ctime>
#include <vector>

int main()
{
    static const int BITS = 4096;
    static const std::bitset<BITS> b(1);
    bool t = false;

    clock_t t1 = clock();
    std::bitset<BITS> a;
    for(int i = 0;i<1000000;i++)
    {
        t = a[i%BITS];
    }
    std::cout << clock() - t1 << std::endl;
    
    clock_t t2 = clock();
    std::bitset<BITS> a2;
    for(int i = 0;i<1000000;i++)
    {
        auto p = b<<(i%BITS);
        t = (a2 & p) == p;
    }
    std::cout << clock() - t2 << std::endl;
    
    clock_t t3 = clock();
    std::bitset<BITS> a3;
    for(int i = 0;i<1000000;i++)
    {
       t = a3.test(i%BITS);
    }
    std::cout << clock() - t3 << std::endl;
    
    return 0;
}

输出:

1
106836
1

 

另外,all(), none(), any() 等方法也能提高一定的效率。

 

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

18 + 18 =