【问题标题】:std::vector<char> VS std::string, which one is faster?std::vector<char> VS std::string,哪个更快?
【发布时间】:2021-05-03 16:01:44
【问题描述】:

我一直在研究元胞自动机,我选择实现它们的方式是创建一个二维单元格向量,其中每个单元格最初都是整数向量本身(因为我希望每个单元格存储多个值),后来我将其更改为短无符号整数,然后更改为字符,因为我意识到最小的数据类型足以满足我的需求......

我目前正在寻找提高性能的方法,这让我想到,如果我用字符串替换字符向量会更好吗?

知道整个矩阵始终具有固定大小,这意味着 2D 网格的大小以及每个单元格的大小都是从一开始就分配的,并且在程序运行期间保持不变:

哪个访问速度更快?调整?复制?或者执行一般操作?

另外,我知道我说过所有东西都有固定的大小,但只是为了将来参考,根据我对向量的表面知识,每次你 push_back() 一个新元素时都必须重新分配一个向量,字符串是这样的吗?

【问题讨论】:

  • 当您想知道哪个更快时需要测量。
  • 如果大小是固定的并且在编译时已知,请考虑使用std::array而不是vector
  • vector 可能会更快,因为它不像字符串那样执行 SSO。不过,您确实应该首先进行基准测试。在没有事实的情况下做出绩效决策是灾难的根源。
  • 没有一般的答案。如果没有真实的用例,很难设置现实的基准来知道哪个性能更好。您很幸运,您已经有一个可以工作的应用程序,您可以用另一个替换一个,看看哪个性能更好。
  • 回复:“每次 push_back() 都必须重新分配向量”——这是不正确的。 vector 通常会分配一些额外的空间,当您向后推时,您将插入该空间。

标签: c++ string optimization vector cellular-automata


【解决方案1】:

哪个更快?

视情况而定。任何一种,取决于你如何使用它们。您可以通过...测量来确定一个是否比另一个快。

它们都使用基本相同的抽象数据结构,并且对于所有操作具有相同的渐近复杂度。

根据我对向量的表面知识,每次 push_back() 都必须重新分配向量

你的知识不正确。 std::vector 只有在向量的容量超过时才需要重新分配,而不是每次 push_back。同样适用于std::string

【讨论】:

    【解决方案2】:

    从这个回复https://stackoverflow.com/a/25581325/15824294我想我们可以观察到字符串在g++和clang++中都比向量快

    【讨论】:

    • 没有。从该答案中,我们可以看到string 在该特定基准测试中的执行速度比std::vector&lt;char&gt; 快。不多也不少。问答实际上是一个很好的例子,说明这种推断是多么不可靠。你没有注意到问题和接受的答案有“矛盾”的结果吗?
    • 其实,任何一个微基准测试的执行时间差异小于几个,比如说,5% 甚至 10%,都是没有意义的。这个时间可能会受到程序控制之外的许多因素的影响,例如其他进程是否正在运行并竞争计算机资源。
    猜你喜欢
    • 2014-10-24
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多