std::vector<char> VS std::string,哪个更快?
Posted
技术标签:
【中文标题】std::vector<char> VS std::string,哪个更快?【英文标题】:std::vector<char> VS std::string, which one is faster? 【发布时间】:2021-05-03 16:01:44 【问题描述】:我一直在研究元胞自动机,我选择实现它们的方式是创建一个二维单元格向量,其中每个单元格最初都是整数向量本身(因为我希望每个单元格存储多个值),后来我将其更改为短无符号整数,然后更改为字符,因为我意识到最小的数据类型足以满足我的需求......
我目前正在寻找提高性能的方法,这让我想到,如果我用字符串替换字符向量会更好吗?
知道整个矩阵始终具有固定大小,这意味着 2D 网格的大小以及每个单元格的大小都是从一开始就分配的,并且在程序运行期间保持不变:
哪个访问速度更快?调整?复制?或者执行一般操作?
另外,我知道我说过所有东西都有固定的大小,但只是为了将来参考,根据我对向量的表面知识,每次你 push_back() 一个新元素时都必须重新分配一个向量,字符串是这样的吗?
【问题讨论】:
当您想知道哪个更快时需要测量。 如果大小是固定的并且在编译时已知,请考虑使用std::array
而不是vector
。
vector 可能会更快,因为它不像字符串那样执行 SSO。不过,您确实应该首先进行基准测试。在没有事实的情况下做出绩效决策是灾难的根源。
没有一般的答案。如果没有真实的用例,很难设置现实的基准来知道哪个性能更好。您很幸运,您已经有一个可以工作的应用程序,您可以用另一个替换一个,看看哪个性能更好。
回复:“每次 push_back() 都必须重新分配向量”——这是不正确的。 vector 通常会分配一些额外的空间,当您向后推时,您将插入该空间。
【参考方案1】:
哪个更快?
视情况而定。任何一种,取决于你如何使用它们。您可以通过...测量来确定一个是否比另一个快。
它们都使用基本相同的抽象数据结构,并且对于所有操作具有相同的渐近复杂度。
根据我对向量的表面知识,每次 push_back() 都必须重新分配向量
你的知识不正确。 std::vector
只有在向量的容量超过时才需要重新分配,而不是每次 push_back。同样适用于std::string
【讨论】:
【参考方案2】:从这个回复https://***.com/a/25581325/15824294我想我们可以观察到字符串在g++和clang++中都比向量快
【讨论】:
没有。从该答案中,我们可以看到string
在该特定基准测试中的执行速度比std::vector<char>
快。不多也不少。问答实际上是一个很好的例子,说明这种推断是多么不可靠。你没有注意到问题和接受的答案有“矛盾”的结果吗?
其实,任何一个微基准测试的执行时间差异小于几个,比如说,5% 甚至 10%,都是没有意义的。这个时间可能会受到程序控制之外的许多因素的影响,例如其他进程是否正在运行并竞争计算机资源。以上是关于std::vector<char> VS std::string,哪个更快?的主要内容,如果未能解决你的问题,请参考以下文章
std::vector<std::string> 到 char* 数组
std::vector<char> VS std::string,哪个更快?
如何将 unsigned char[] 转换为 std::vector<unsigned char>
编辑: std::vector<std::__cxx11::basic_string<char> >' 到 'std::__cxx11::string' aka 'std::_