为什么这段代码需要这么长时间?

时间:2011-11-23 16:47:29

标签: c++

for (int i = 0; i < level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice].size(); i++)
{
    //adds the correct nodes to the search
    search.push_back(level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice][i]);
}

这是一个64位系统。

程序大约需要30秒才能执行循环的一次传递。有没有理由发生这种情况?我不确定你们需要什么信息,但是我会问你,我会帮你的。

搜索是整数向量,pathLookupVectors是向量向量向量的向量。

搜索通常最终会被平均27个整数填充,但可能会高一个或低到一个。

我注意到我按值传递pathLookupVectors。这可能是问题吗?

4 个答案:

答案 0 :(得分:4)

如果没有看到所有相关代码,很难说,但我怀疑:

level.PathLookupVectors()

...可能返回某种类型的vector按值,而不是按指针或按引用。这只是一个猜测,但如果是这样,你可以创建整个向量的临时副本,然后修改它。

答案 1 :(得分:2)

尝试:

correct_type &cache = level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice];
for (unsigned int i = 0, size = cache.size(); i < size; i++)
{
    //adds the correct nodes to the search
    search.push_back(cache[i]);
}

这是为了避免多次重新计算level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice]

答案 2 :(得分:0)

此语句在每次迭代时执行两次。在for-statement的条件下:

level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice].size()

在for-statement的正文中:

search.push_back(level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice][i]);

那不是NO!

编辑:这完全没必要,因为:

level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice]

永远不会改变。你应该做的是将它分配给一个变量,并使用for循环中的变量而不是每次都计算它。

答案 3 :(得分:0)

可能是因为search很大而且你一遍又一遍地分配一个大的向量。在分配之前尝试使用std::vector::reserve

如果真的那么大,你可能不应该使用矢量来构建它。使用其他数据结构构建它,然后将其复制回矢量。

如果您在构建时需要建立索引,请使用std::deque。如果不这样做,那么只需使用std::list