【发布时间】: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 的迭代器。如果Range 是std::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