【发布时间】:2012-03-07 04:12:46
【问题描述】:
我有一个现有的算法,如果可能的话,我需要对其进行优化。目前无法在此算法中进行大量更改。该算法适用于std::vector< std::vector<unsigned char> > 的实例。它看起来像这样:
typedef std::vector<unsigned char> internal_vector_t;
std::vector< internal_vector_t > internal_vectors;
while (fetching lots of records) {
internal_vector_t tmp;
// reads 1Mb of chars in tmp...
internal_vectors.push_back(tmp);
// some more work
}
// use this internal_vectors
该算法使用 push_back() 在 internal_vectors 的 internal_vector_t 实例中插入很多次。 大多数 internal_vector_t 实例的大小为 1 Mb。由于internal_vectors 的大小未知,因此没有预先完成reserve()。
我不明白的第一件事是当internal_vectors 达到其当前容量时会发生什么,需要分配一个新块并将其当前内容复制到更大的内存块中。由于大多数块的大小为 1Mb,因此复制是一个很长的操作。 我是否应该期望编译器(gcc 4.3、MS VC++ 2008)能够对其进行优化以避免复制?
如果无法避免复制,是否将更改为std::deque 帮助?我考虑 std::deque 因为我仍然需要通过像 internal_vectors[10] 这样的索引来访问。像这样:
typedef std::vector<unsigned char> internal_vector_t;
std::deque< internal_vector_t > internal_vectors;
// the same while
据我了解,std::deque 不需要重新分配曾经分配的位置。我对 std::deque 在这种情况下会要求在 push_backs 上进行更少的分配和复制是对的吗?
更新:
1) 根据DeadMG MSVC9 进行此类优化(Swaptimization - TR1 Fixes In VC9 SP1)。 gcc 4.3 可能不做这种优化。
2) 我已经分析了使用std::deque< std::vector<unsigned char> > 的算法版本,我发现它的性能更好。
3) 我还使用了Mark Ransom 建议的swap。使用它可以提高性能:
internal_vector_t tmp;
internal_vectors.push_back(empty);
tmp.swap(internal_vectors.back());
【问题讨论】:
-
您使用的是
insert还是push_back?代码上写着insert,文本上写着push_back,对于一个向量来说,两者的成本是完全不同的。 -
当容量用完时,显然它必须分配更多的 RAM。它基于增量值执行此操作。增量和初始容量都应该是可设置的。增量值越高,每次用完时分配的内存就越多。
-
只是
reserve()一大块(2048 年?),应该可以解决问题... -
我使用
push_back,在我的问题中修复了它 -
@skwllsp:那么您的代码示例与您的问题无关,我们无法进一步提供可靠的帮助。
标签: c++ optimization vector memory-management deque