std::stringstream 与 std::string 连接多个字符串

问题描述 投票:0回答:3

我知道

std::stringstream
的优点之一是它是
std::istream
,因此它可以接受来自定义
operator<<
std::istream
的任何类型的输入,也可以接受来自基元类型的输入。

我不会使用

operator<<
;相反,我只是要连接许多字符串。对于连接多个字符串,
std::stringstream
的实现是否比
std::string
更快?

c++ string stringstream
3个回答
85
投票

没有理由期望

std::string
的附加函数比
stringstream
的插入函数慢。
std::string
通常只不过是可能的内存分配/复制以及将数据复制到内存中。
stringstream
必须处理语言环境等问题,即使是基本的
write
调用也是如此。

此外,

std::string
还提供了最小化或消除除第一次内存分配之外的任何内容的方法。如果您
reserve
有足够的空间,那么每次插入都只不过是一个
memcpy
。这对于
stringstream
来说是不可能的。

即使它比

std::string
的附加函数更快,您仍然 have 将字符串从
stringstream
中复制出来以对其执行某些操作。所以这是另一个分配 + 副本,您不需要
std::string
。尽管 C++20 看起来至少可以消除这种特殊需求。

如果您需要

格式化
,则应该使用std::stringstream,而不仅仅是将一些字符串粘在一起。


2
投票

在最近对

Quick-Bench
进行的一组基准测试中,与使用
std::stringstream
运算符连接字符串相比,
std::string +=
表现出较低的性能。这是一个值得注意的发现,因为附加多个字符串和文字是字符串处理中的频繁操作。

该基准测试在相同条件下比较了两种方法,目的是连接由文字和小字符串对象组成的长字符串。结果表明 std::stringstream 效率较低。

请在此处找到详细的基准测试结果:

https://quick-bench.com/q/iR8hY3MmHXCSXe5vvY28C-6mQfY

需要注意的是,虽然

std::stringstream
在这个特定的测试用例中表现出较差的性能,但实际性能可能会有所不同。编译器版本、优化设置和底层硬件等因素都会影响结果。因此,建议运行针对您的应用程序的特定用例量身定制的基准测试,以确定最佳方法。


0
投票

这可能偏离主题,但就我而言,我很好奇对于基于游标的词法分析器,将几个字符附加到大量字符串的延迟更短。这里:

https://quick-bench.com/q/DT5-IfudMSlwyg8SaTM7dWMW83s

我发现

std::stringstream::put(char)
产生了最快的结果,即使使用
std::stringstream::str()
进行了额外的复制和分配。这些是我用 C++ 编写的第一个基准测试,因此任何有关使它们更精确或更有用的反馈将不胜感激。

注意:我使用

((char)rand() % 255)
来确保我不只是从数据部分获取常量字符,因为我正在尝试模拟读取正在逐个字符处理的大型文本文件,并从这些典型的小序列构造标记。这也是固定
for (int i = 0; i < 15; ++i)
连接的原因。我们的想法是,从
rand()
获取不确定性字符更类似于从运行时加载到内存中的大字符串中读取,而不是某些编译时常量。也许我应该构建一个像这样的字符串并用它来运行所有测试。

© www.soinside.com 2019 - 2024. All rights reserved.