c++ - 通过 istringstream 的 c++ 字符串标记化的性能开销

标签 c++ optimization

我想知道的性能开销是多少

string line, word;
while (std::getline(cin, line))
{
    istringstream istream(line);
    while (istream >> word)
        // parse word here
}

我认为这是标准c++标记化输入的方法。

具体来说:

  • 每行是否复制了三次,首先通过 getline , 然后通过 istream构造函数,最后通过 operator>>每个词?
  • 会经常 build 和破坏istream成为问题?如果我定义 istream 的等效实现是什么在外层之前while循环?

谢谢!

更新:

等效的实现

string line, word;
stringstream stream;
while (std::getline(cin, line))
{
    stream.clear();
    stream << line;
    while (stream >> word)
        // parse word here
}

将流用作本地堆栈,压入行并弹出单词。 这样就可以摆脱之前版本中可能频繁调用构造函数和析构函数,利用流内部缓冲的作用(这个点对吗?)。

替代解决方案,可能是扩展 std::string 以支持 operator<<operator>> ,或扩展 iostream 以支持某事。喜欢locate_new_line . 在这里集思广益

最佳答案

不幸的是,iostreams 不适用于性能密集型工作。问题不是在内存中复制东西(复制字符串很快),而是虚函数调度,可能与每个字符的多个间接函数调用有关。

至于你关于复制的问题,是的,当你初始化一个新的 stringstream 时,所有的东西都会被复制。 (字符也通过 getline>>> 从流复制到输出字符串,但这显然无法阻止。)

使用 C++11 的移动工具,您可以消除多余的拷贝:

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 基本上足够快,因此您可以对代码进行原型(prototype)设计以使其正常工作,然后优化瓶颈而无需重写所有内容。

关于c++ - 通过 istringstream 的 c++ 字符串标记化的性能开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961224/

相关文章:

c++ - 大括号初始值设定项列表作为函数参数

optimization - F# "for loop"优化

javascript - 优化 JavaScript setTimeout

c++ - 混合调试和发布库/二进制文件 - 不好的做法?

c# - 为什么不用 GOTO 语句?

css - 应该采用什么技术来优化@font-face 渲染?

java - EpGap 可以取的最大值是多少?

python - 超过 5000 万行数据 - CSV 或 MySQL

c++ - 使用 Parent 构造函数初始化子类

c++ - 在 Windows 上执行流程并获取结果