发布版本中的运行时间过长(调试版本正常)

时间:2015-01-06 21:15:03

标签: c++ c visual-studio-2010

我对visual studio中的调试\发布模式有疑问。

我编写了一个递归程序,它获取一个整数数组(最大大小为20个单元格)并按照该规则重新排列:

第一个数字是素数,之后是(非素数),数字可以被2整除,然后是可以被3整除的数字,然后是5,乘以7,乘以11等等......

我不知道为什么,但是当程序在调试模式下运行时,它会立即成功完成。但在发布模式下大约需要3.5分钟。为什么会有很大的不同?

我不知道问题是效率低下还是其他问题。如果代码太长而无法理解,那没关系,我会很高兴只是为了指导。

这是代码:

int main()
{
    printf("What is the size of the array?\n");
    scanf("%d",&arrySize);
    printf("Enter %d integers\n",arrySize);
    inputArry(arry,arrySize,0);

    arrangeArry(arry,1,arrySize);

    printArry(arry,0,arrySize);

    main();
    return 0;
}

//insert numbers to array
void inputArry (int arry[], int size, int index)  
{
    if (index>size-1)
        return;

    scanf("%d",&arry[index]);

    inputArry(arry,size,index+1);
}

void arrangeArry (int arry[], int index, int size) // Arrange array
{
    if (index >=size)
        return;

    arrangeSubArry(arry,index);

    arrangeArry(arry,index+1,size);
}

// Given arranged array except the last number, this
//   function arranges the array including the last number
void arrangeSubArry (int arry[], int index) 
{
    int temp=0;

    if (index==0)
        return;

    if (dividedBy(arry[index],2)<dividedBy(arry[index-1],2))
    {
        temp=arry[index];
        arry[index]=arry[index-1];
        arry[index-1]=temp;

        arrangeSubArry(arry,index-1);
    }
}

// Gives the first prime number that int num is divided by
int dividedBy (int num, int counter) 
{
    if (num==1||num==0||isPrime(num,sqrt(num))==1)
        return 1;
    if (isPrime(counter,sqrt(counter))==1)
    {
        if (num%counter==0)
            return counter;
    }

    dividedBy(num, counter+1);
}

2 个答案:

答案 0 :(得分:2)

  

我对visual studio中的调试\发布模式有疑问。

它实际上与调试或发布版本有关。


  

我写了一个递归程序,它获取了一个整数数组

没有基本情况。有些东西需要阻止递归。


int main()
{
    ...

    main();
    return 0;
}

在C ++程序中调用main是未定义的行为。见Can main function call itself in C++?。一旦程序非法,任何事情都可能发生,一切正常。

留意demons flying out of your nose

答案 1 :(得分:0)

如果没有例如段错误,我无法看到main的递归执行会以任何方式结束。

递归算法总是应该定义退出条件:

int main(void) {
  /* code */
  if(/* condition */) {
    main();
  }

  /* So, we have our chances to return from main */
  return 0;
}

但请勿以此方式致电main。将主体包裹到另一个功能中并改为调用它。

请原谅我,就像你注意到的那样,“代码太长而无法理解”,但问题的答案是:处理对main的无限调用。