【发布时间】:2012-03-09 07:47:07
【问题描述】:
一直有人告诉我矢量速度很快,而且在我多年的编程经验中,我从未见过任何可以收缩的东西。我决定(过早地优化和)编写一个关联类,它是一个围绕顺序容器(即::std::vector 并提供与::std::map 相同的接口。大部分代码非常简单,我可以使用它难度不大。
但是,在我对各种大小的 POD 类型(4 到 64 字节)和 std::strings(计数从 8 到 2000 不等)的测试中,::std::map::find 比我的 ::associative::find 快,通常在 15% 左右更快,几乎适用于所有测试。我做了一个Short, Self Contained, Correct (Compilable), Example 清楚地显示了这个at ideone 我检查了MSVC9 的::std::map::find 实现并确认它与我的vecfind 和::std::lower_bound 代码非常匹配,并且无法解释为什么::std::map::find 运行得更快,除了关于 Stack Overflow 的讨论之外,人们推测二进制搜索方法在最后一次比较之前根本不会从向量的局部性中受益(使其不更快),并且它需要 ::std::map 节点不使用的指针算法t 需要,使其变慢。
今天有人在这方面向我提出挑战,并提供了this code at ideone,当我测试时,它显示向量的速度是原来的两倍多。
StackOverflow 的编码人员是否想就这种明显的差异向我提供启发?我已经检查了这两组代码,它们对我来说似乎是平等的,但也许我对它们都玩这么多是盲目的。
(脚注:这 非常接近 one of my previous questions,但我的代码有几个已解决的错误。由于新的信息/代码,我觉得这足以证明一个单独的问题. 如果没有,我会努力合并它们。)
【问题讨论】:
-
您是否尝试过分析这两种实现?老实说,仅仅经常看代码并没有真正的帮助。导航具体数据应该为您指明大方向。
-
由于所有内容都被内联,我的分析器给我的信息比我从输出中得到的信息要少。
-
过多的内联会减慢速度,因为您不断地从 CPU 缓存中弹出内容。由于您在 Windows 上编译代码大小而不强制任何内联和测量。
-
这不应该过多地掩盖问题,具体取决于您的分析方式。您的分析方法是什么?样品还是跟踪?为了获得更准确的读数,我会更改您的测试。只是将 1 个值与另一个值进行简单比较是没有意义的。每个测试至少运行 100 次,然后将结果时间除以 100。它会给你一个更准确的时间。
-
我发现您在 ideone.com 上发布的代码 (ideone.com/41iKt) 存在一些问题。 (ideone 实际上显示矢量更快,但使用 VS 2011 dp 的本地构建显示地图更快)首先我移动了地图变量并使用它来初始化矢量以获得相同的元素排序和唯一性,然后我给了
lower_bounda只比较first的自定义比较器,因为这就是 map 要做的事情。在这些更改之后,VS2011 显示相同数量元素的向量更快(尽管 ideone 时间没有显着变化)。 ideone.com/b3OnH