我想知道性能开销是多少
string line, word;
while (std::getline(cin, line))
{
istringstream istream(line);
while (istream >> word)
// parse word here
}
我认为这是标准c++
标记化输入的方法。
再具体一点:
- 每行是否复制三遍,首先通过
getline
,然后通过istream
构造函数,最后一个viaoperator>>
对于每个单词?
- 会频繁的建造和破坏
istream
是一个问题吗?如果我定义的话,等效的实现是什么istream
在外层之前while
loop?
Thanks!
Update:
等效实现
string line, word;
stringstream stream;
while (std::getline(cin, line))
{
stream.clear();
stream << line;
while (stream >> word)
// parse word here
}
使用流作为本地堆栈,推送行并弹出单词。
这将摆脱以前版本中可能频繁的构造函数和析构函数调用,并利用流内部缓冲效果(这一点正确吗?).
替代解决方案,可能是扩展 std::string 以支持operator<<
and operator>>
,或扩展 iostream 以支持某事物。喜欢locate_new_line
. 这里只是集思广益.
不幸的是,iostreams 不适合性能密集型工作。问题不在于复制内存中的内容(复制字符串很快),而是虚拟函数调度,可能会调整每个字符的多个间接函数调用。
至于您关于复制的问题,是的,正如所写,当您初始化新的时,所有内容都会被复制stringstream
。 (字符也可以通过以下方式从流复制到输出字符串:getline
or >>
,但这显然是无法阻止的。)
使用 C++11move
设施,您可以消除无关的副本:
string line, word;
while (std::getline(cin, line)) // initialize line
{ // move data from line into istream (so it's no longer in line):
istringstream istream( std::move( line ) );
while (istream >> word)
// parse word here
}
话虽如此,只有当测量工具告诉您性能是一个问题时,性能才是一个问题。 Iostreams 灵活且强大,并且filebuf
基本上足够快,因此您可以对代码进行原型设计,使其可以工作,然后优化瓶颈,而无需重写所有内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)