2011-11-23 72 views
-4
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的值。这可能是问题吗?

+1

循环执行了多少次迭代? –

+0

约27,但它从1到35可能不等。 – SirYakalot

+0

“搜索”有多大? PathLookupVectors和Nodes返回什么以及它们如何实现? .Index()是做什么的?分析器告诉你什么? –

回答

4

这是很难没有看到所有的相关代码的说法,但我怀疑:

level.PathLookupVectors() 

...可能是由价值回归某种形式的vector,而不是由-指针 - 或逐参考。这只是一个猜测,但如果是这样,你可以创建整个向量的临时副本,然后修改它。

+0

我想这可能就是它!我会在今晚检查.. – SirYakalot

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]多次。

+0

我不在我的电脑,但我强烈怀疑你是对的。我会尽快检查 – SirYakalot

0

此声明在每次迭代中执行两次。在有条件的for语句:

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

而且在for语句体:这是一个

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

NO NO!

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

level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice] 

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

+0

有趣!我对此很新。那么我将如何改变它不做呢? – SirYakalot

+0

编译器不内联这样的东西? – SirYakalot

+0

@SirYakalot不,它每次计算它 – juliomalegria

0

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

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

如果您在建筑时需要索引访问,请使用std::deque。如果你不这样做,那就用std::list