string <char> vs string <unsigned char =“”> </unsigned> </char>

时间:2012-07-21 20:30:53

标签: c++ string performance

我有一个关于“普通”C ++字符串和一串无符号字符之间区别的问题。 当生成一些chars和unsigned char s的伪随机字符串时,我注意到代码构建普通字符串所需的时间与由unsigned char组成的字符串之间存在巨大的性能差异。

我使用的代码:

#include <tr1/random>
#include <string>


using namespace std;
using namespace tr1;

typedef basic_string<unsigned char > ustring;

string generateString(){
    string retStr;
    char a;

    for(unsigned int i = 0; i < 1000; i++){             
        a = rand();
        retStr+=a;            
    }
    return retStr;
}

ustring generateUString(){
    ustring retStr;
    unsigned char a;

    for(unsigned int i = 0; i < 1000; i++){
        a = rand();
        retStr+=a;
    }
    return retStr;
}


int main(int argc, char* args[]){

    srand(0);

    string thing;
    ustring uthing;

    for(unsigned int i = 1; i< 100000; i++){ 
        //thing = generateString(); // this needs 2 second to execute
        uthing = generateUString(); //  and this 13

    }

    return 0;
}

基本上,代码需要2秒才能执行generateString() 100 000次,而执行generateUString()需要13秒才能执行100 000次。

究竟是什么原因?我猜这是+=运算符,因为当我剪切相应的行时,差异会消失(实际上,generateUstring()似乎更快,我想因为模运算在这种情况下更容易)。 / p>

但是为什么将字符串附加到字符串比将unsigned char附加到unsigned char字符串更快更快呢?我应该避免使用unsigned char s的字符串吗?

1 个答案:

答案 0 :(得分:2)

原因可能是basic_string<char>libstdc++.so中显式实例化,(默认情况下)使用-O2编译。因此,如果您不通过优化编译程序,basic_string<unsigned char>操作将无法优化,但未内联的所有basic_string<char>操作都将使用libstdc++.so中的优化代码。