我有一个关于“普通”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的字符串吗?
答案 0 :(得分:2)
原因可能是basic_string<char>
在libstdc++.so
中显式实例化,(默认情况下)使用-O2
编译。因此,如果您不通过优化编译程序,basic_string<unsigned char>
操作将无法优化,但未内联的所有basic_string<char>
操作都将使用libstdc++.so
中的优化代码。