处理deque块大小导致性能问题

时间:2012-12-21 12:03:08

标签: c++ stl deque

任何在性能关键代码中使用'deque'的人可能已经注意到(至少在VS2010附带的STL中)块大小为16字节。这是VS2010随附的头文件中的实际snippit:

#define _DEQUESIZ   (sizeof (value_type) <= 1 ? 16 \
    : sizeof (value_type) <= 2 ? 8 \
    : sizeof (value_type) <= 4 ? 4 \
    : sizeof (value_type) <= 8 ? 2 \
    : 1)    /* elements per block (a power of 2) */

这不是新信息,有关此decl导致性能问题的详细信息,请参阅About deque<T>'s extra indirection

我想在各种算法中使用deque,但是如果我受限于此实现则不行。绕过这个问题最好的方法是什么?

1)使用另一个没有此问题的容器。如果是这样,有人可以指向一个没有GNU许可限制的人吗?

2)创建一个解决此限制的新容器类。这个新的容器类不会成为std命名空间的一部分。

3)编辑'deque'头文件中的_DEQUESIZ定义。 IMO,我认为这是合法的,因为_DEQUESIZ的确切规范不是STL定义的deque概念的一部分。

4)为deque(和相关的迭代器类)添加一个额外的模板参数,以允许在编译时指定块大小。此参数将默认为_DEQUESIZ的当前定义。我几乎拒绝这个解决方案,因为现在使用这个标准化STL的代码不可移植。

5)大堂会议让STL改变,所以我可以愉快地使用'deque'而不会出现性能问题。国际海事组织,这可能比目前的财政悬崖辩论更成功。顺便说一句,我是加拿大人,因此整个众议院+参议院+总统的指导令人困惑。

2 个答案:

答案 0 :(得分:0)

不是答案,但评论时间太长了:

如果您担心性能,我不建议您编写新的容器类。通常,STL实现基于它们所针对的特定编译器的实现细节使用非可移植优化,并且您通常无法这样做。我曾经尝试过自己重写一些相当简单的STL算法,并且执行速度大约是STL算法的一半。

更改_DEQUESIZ可能会在无法预料的地方造成性能问题,因为其他代码可能会针对原始值进行优化。再一次,您在为特定编译器编写代码时可以执行的非便携式优化。不仅如此:您甚至可能会破坏一些代码,这些代码取决于_DEQUESIZ的实际值。

总而言之,在我看来,只有你的选项1在可行的情况下脱颖而出。不幸的是,我不知道有什么好的选择;这就是为什么我写道,这不是你问题的真正答案。

答案 1 :(得分:0)

我赞成1)。

标准库的libc ++实现是在一个非常宽松的许可证下发布的,实际上很自由,你可以调整它以适应它,如果你的编译器扼杀它(它是围绕Clang设计的,它更符合C和C ++ 11意识到比VS 2010)。您只需要保留许可证。