【问题标题】:Why is 'insert' faster than 'append' in string padding?为什么在字符串填充中“插入”比“追加”快?
【发布时间】:2014-12-11 07:24:42
【问题描述】:

我想在 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,所以测试结果不正确。

【问题讨论】:

  • 为什么要将append 调用的结果分配给一个新字符串?
  • 如果\0在原始字符串之后填充,那么ss.str()只返回字符串t而不是填充字符串。

标签: c++ string padding


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-03-21
    • 2017-04-14
    • 2012-09-17
    • 2011-06-21
    • 2012-02-09
    • 2016-08-27
    • 1970-01-01
    • 2016-12-26
    • 2010-12-13
    相关资源
    最近更新 更多