我正在优化算法。我遇到了一个奇怪的怪事。
以下内容:
//The following is completely unused
vector<int>** rotated_squares;
rotated_squares = new vector<int>*[31];
for (int i=0;i<31;++i) {
rotated_squares[i] = new vector<int>[31];
}
{
//Lots of computation, using other vectors, but not rotated_squares
}
。 。 。至少比以下慢十倍:
{
//The exact same computation as above.
}
我不知道是什么原因引起的。我唯一能想到的是它是底层实现的工件。为此,使用Visual Studio 2010 for C ++编译器。
编辑:澄清,下面的计算是变慢的部分。在分析时,顶部的内存分配几乎可以忽略不计。
所以问题是我在顶部添加了行,代码运行速度慢了十倍。通过调试,额外的内存分配只需要几分之一秒,但计算代码(通常需要大约8秒)开始需要几分钟。
编辑:根据大众需求,可以在此处找到算法的来源:http://pastebin.com/Yf78gTNC。关键是#if 1可以设置或取消设置,并且代码编译得很好 - 但是使用它,它在计算部分运行得慢得多。
编辑:我已将代码缩减为以下内容:http://pastebin.com/mpnPsQE1。在我的代码中,这会导致问题。但是,制作一个简单的测试用例(即仅使用此代码的主要功能)不显示问题。
答案 0 :(得分:3)
我不知道造成这种情况的原因。
vector<const Vec2>** rotated_squares;
rotated_squares = new vector<const Vec2>*[size2[1]]; //size2[1]==31
for (int i=0;i<size2[1];++i) {
rotated_squares[i] = new vector<const Vec2>[size2[0]]; //size2[0]==31
}
一部分。
答案 1 :(得分:2)
使用C +++ 03和std::vector< T const >
,你已经进入了未定义的行为领域。即使使用10分钟拖网标准,我也不确定C ++ 11的情况。但可能是相同的,在这种情况下,不需要特别的解释。
但是,可能是您未显示的代码以及据称放慢速度的代码正在引用rotated_squares
。
可能还有添加的代码导致缓存未命中。
没有代码就很难重现,但它可能有助于将减速代码放在自己的函数中。
使用ESP电路过载...集中......不,这也不起作用。