为什么'insert'比字符串填充中的'append'更快?

时间:2014-10-16 03:26:38

标签: c++ string padding

我想在C ++中填充string

最初,只需将\0直接添加到字符串的末尾。

paddingstr = "test";
for (int index = 0; index < 20000*1024; ++index){
    paddingstr += '\0';
}

然后我找到了几种实现目标的方法,它们是

我想知道哪种方法效率最高。然后我比较它们。

string paddingstr = "test";
__int64 before_run_t = GetTimeMs64();
string afterpadding = paddingstr.append(string(20000*1024, '\0'));
cout << "The run time of append is " << GetTimeMs64() - before_run_t << endl;

paddingstr = "test";
before_run_t = GetTimeMs64();
paddingstr.insert(paddingstr.end(), 20000*1024, '\0');
cout << "The run time of insert is " << GetTimeMs64() - before_run_t << endl;

paddingstr = "test";
before_run_t = GetTimeMs64();
for (int index = 0; index < 20000*1024; ++index){
    paddingstr += '\0';
}
cout << "The run time of adding is " << GetTimeMs64() - before_run_t << endl;

ostringstream ss;
before_run_t = GetTimeMs64();
ss << 't' << std::setw(20000*1024) << std::setfill('a') << '\0';
paddingstr = ss.str();
cout << "The run time of ostream is " << GetTimeMs64() - before_run_t << endl;

结果是

The run time of append is 60
The run time of insert is 3
The run time of adding is 8589
The run time of ostream is 2276

我的问题是为什么插入是最快的?

更新:测试代码已从

更改
ss << 't' << std::setw(20000*1024) << std::setfill('\0'); 
paddingstr = ss.str();

由于\0在字符串后面填充,而函数str()只是将t返回到paddingstr,因此测试结果不正确。

1 个答案:

答案 0 :(得分:2)

插入是最快的,因为你告诉它一次添加20 MB的零,它可以分配一次。追加有点慢,因为它必须分配20 MB的零然后复制它们。循环很慢,因为它必须不断地重新分配越来越多,如果你先调用paddingstr.reserve(20000*1024 + paddingstr.size()),你至少可以部分修复。并且ostringstream很慢,因为stringstreams通常很慢,而且你最后会复制到字符串。