C++ 在函数中再分配一个变量会大大增加执行时间
我的程序出现了一些奇怪的行为。我有一个函数,在执行过程中经常被调用,当我在这个函数中只声明了一个C++ 在函数中再分配一个变量会大大增加执行时间,c++,gcc,memory-management,cygwin,C++,Gcc,Memory Management,Cygwin,我的程序出现了一些奇怪的行为。我有一个函数,在执行过程中经常被调用,当我在这个函数中只声明了一个double变量时,程序运行速度慢了10倍。以下是功能代码: void MazeWall::goSomewhere( WallInfo &caller ) { double slowDown = 0; bool possibleWays[numberOfDirections]; bool BadWays[numbe
double
变量时,程序运行速度慢了10倍。以下是功能代码:
void MazeWall::goSomewhere( WallInfo &caller )
{
double slowDown = 0;
bool possibleWays[numberOfDirections];
bool BadWays[numberOfDirections];
int weightsOfDirections[numberOfDirections] = {};
int numOfPosWays = findPosWays( caller, possibleWays );
int numOfBadWays = findBadWays( caller, BadWays, possibleWays );
int selectedDir;
if ( numOfPosWays == numOfBadWays ) // if all ways are bad
{
selectedDir = randomChoice( BadWays, numberOfDirections, true ); // select a bad way
}
else
{
for ( int k = 0; k < numberOfDirections; k++ )
{
possibleWays[k] = possibleWays[k] && (!BadWays[k] ); // leave only good ways
}
int step = 32 / numberOfDirections;
// check how occupied these ways are:
for ( int l = 0; l < numberOfDirections; ++l )
{
CyclicInt directionOfSight( 0, 31, 28 );
if ( possibleWays[l] )
{
directionOfSight = directionOfSight + l*step;
int integralDistance = 0;
for ( int m = 0; m <= 8; ++m )
{
integralDistance += caller.distanceToAWall32( directionOfSight, 32 );
directionOfSight = directionOfSight + 1;
}
weightsOfDirections[l] = integralDistance;
}
}
selectedDir = weightedRandom( weightsOfDirections, numberOfDirections );
}
CyclicInt cyclicDir( 0, numberOfDirections - 1, selectedDir );
caller.step( cyclicDir ); // make 1 step in selected direction
}
void MazeWall::goSomewhere(WallInfo和caller)
{
双减速=0;
可能的路线[方向数];
bool-BadWays[方向数];
int-weightsOfDirections[numberOfDirections]={};
int numofosways=findPosWays(调用者,可能途径);
int numobadways=findBadWays(调用者、坏道、可能通道);
int-selectedDir;
if(numofosways==numobadways)//如果所有的方法都是坏的
{
selectedDir=randomChoice(坏方法,numberOfDirections,true);//选择坏方法
}
其他的
{
对于(int k=0;k 对于(int m=0;m而言,您的错误在于您没有使用优化进行编译,或者您的编译器已经过时。任何合适的编译器都会将未使用的变量从可执行文件中完全删除
我们可以根据额外的变量、更多的缓存未命中等推测内存中的可能路径
和坏路径
的对齐方式,但关键是没有优化的任何评测都没有任何意义。在这两种情况下查看中间汇编程序代码可能是有用的。再添加一个变量可能会改变编译器使用CPU寄存器与堆栈分配变量的方式。前者显然更快。我发现了一个愚蠢的错误,它减慢了代码的速度。我正在使用对象名作为参数实例化类的一个对象,如下所示
MyClass obj( obj );
我完全不知道为什么这样做有效,但这就是我的程序运行缓慢的原因。我猜新变量的分配会导致内存中的某些移动,从而导致随机的减速和加速。我猜这是由于填充,请查看编译的asm代码。我敢打赌,定义该变量后,缓存将丢失更多。如果您编译w打开警告后,您将收到未使用变量的警告。在我看来,未使用变量基本上是一个逻辑错误,因此抱怨它运行缓慢是第二个问题。@spiderface adding-O2减慢了执行速度?@Brandin在调查中,如果它们确实有效,那么这个问题是好的。