【问题标题】:Is there any performance penalty for using std::stack rather than the underlying std::deque?使用 std::stack 而不是底层的 std::deque 是否有任何性能损失?
【发布时间】:2021-05-18 14:57:41
【问题描述】:

我想实现一个 LIFO 堆栈对象。 C++ 标准库提供了一个方便的堆栈结构 (std::stack) 和一个非常简单的接口。默认情况下,它使用 std::deque 作为其底层容器。

使用 std::stack 而不是直接使用 std::deque 是否有任何性能损失?

我的用例将涉及每秒 许多 次弹出和推送。

【问题讨论】:

  • 使用堆栈,或者使用双端队列并手动对其进行堆栈操作应该具有相同的性能。如果您真的想知道,请同时编写代码并进行基准测试。
  • 介绍一下,实验比基于意见的答案要好得多
  • @AlessandroTeruzzi 实际上,随机分析可能弊大于利。在进行分析之前,必须知道他们的期望以及原因。
  • @SergeyA 你说得有道理,我的评论很仓促,我不认为堆栈和双端队列实现之间有任何显着差异。代码的清晰性始终非常重要。但是,如果没有实验,我无法确定,“很多”不足以驳回这个问题。话虽如此,基准比分析更好。

标签: c++ stack


【解决方案1】:

正如评论者所指出的,在这种情况下,您应该始终首先benchmark。例如,我使用了一个名为Quick Bench 的工具,因为它是在线的并且可以嵌入到这里。您应该始终选择最适合特定需求的工具。

在这种情况下,答案取决于您是否启用了优化。请注意,您应该始终对优化的构建进行基准测试,但我包含了未优化的版本以显示结果有何不同。如果我们在关闭优化(g++ 上的 -O0)的情况下运行基准测试 (link),我们会看到 stack 稍微慢一些:

但是,当我们使用优化(g++ 上的 -O3)运行基准测试 (link) 时,情况就不同了:

性能几乎相同。这是由于inlining。这意味着在发布版本中,您不会因使用stack 而遭受任何性能损失。在 C++ 中,这称为零成本抽象

值得指出的是,在现实中,即使是“零成本”抽象仍然需要付出代价 - increased compile times

【讨论】:

  • @cutcrew 很高兴我能帮上忙!如果答案解决了您的问题,您可以对其进行投票并将其标记为已接受,以便将来的其他用户可以更轻松地找到它。
【解决方案2】:

不,使用std::stack 不会更改性能配置文件(与直接使用std::deque 相比)。

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2012-03-07
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多