【问题标题】:Composited container from std::set is faster than std::set itself?来自 std::set 的复合容器比 std::set 本身快吗?
【发布时间】:2014-06-05 09:00:54
【问题描述】:

我制作了一些复合容器 Range,它接受最小/最大范围作为 std::pair 或一组整数作为 std::set

在内部,它将输入的副本保存为void *

这个容器支持iterators,我很好奇这个容器与在集合std::set上的迭代相比有多快。

我确保使用以下策略编写测试中的每个迭代循环:

  • 无后增量(较慢)
  • 确保编译器无法完全优化循环
  • 比较相同的东西

我有以下时间: performance test

速度测试
范围的运行时间:[对]:13.0522 毫秒
范围的运行时间:[设置]:272.54 毫秒
std::set 的运行时间:438.239 毫秒
RUNTIME 范围:正常 For 循环:0.000175 毫秒

第一 我很惊讶,我也希望你,因为我的Range 容器为什么会更快,因为Range 的迭代器包含std::pair(只是一个整数)和std::set 的迭代器。如果Rangestd::set,我的Range::iterator 实现实际上会将所有运算符转发到std::set。

第二 对您有任何 cmets 执行此操作要高效。有没有更好的办法?

【问题讨论】:

  • 这个问题更适合codereview.stackexchange.com
  • 请注意,您的程序在 MSVC2013 上永远运行。那是因为它的 RAND_MAX 是 32767,但是您尝试将 1E5(唯一)元素插入到集合中。
  • 我认为这与您在Range<Type> range(s); 中执行的副本有关。如果我在插入后复制集合,例如插入一些set<Type> s2; 然后在插入auto s = s2; 之后,“std::set”循环会更快。这可能与局部性有关,因为集合的副本通常会以遍历顺序复制元素,而插入会产生在非常不同的时间分配的邻居。
  • @dyp: nice =) 我认为这是正确的:

标签: performance c++11 stl iterator stdset


【解决方案1】:

随着 dyp 的评论: std::set 更快!

速度测试 =============================
范围的运行时间:[对]:8.69353 毫秒
范围的运行时间:[设置]:281.202 毫秒
std::set 的 RUNTIME: 220.367 ms // 重新复制了 std::set
RUNTIME 范围:Normal For 循环:0.000196 ms

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多