为什么在VCC 2003中编译需要这么长时间?

时间:2009-03-12 11:43:25

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

我的团队需要“Sobol准随机数发生器” - 一种常见的RNG,以高质量的结果和操作速度而闻名。我找到了what looks like a simple C implementation on the web。在家里,我能够使用我的Linux GCC编译器几乎立即编译它。

第二天我在工作中尝试了它:如果我在调试模式下在Visual Studio中编译它需要大约1分钟。如果我在发布模式中编译它,则需要大约40分钟。

为什么?

我知道“发布”模式会触发一些编译器优化......但是这个文件如何才能实现这么长时间才能优化?它主要是评论和静态数据。几乎没有什么值得优化的。

这些PC都不是特别慢,无论如何我知道编译时间在一系列Windows计算机上是一致的。我还听说Visual Studio的新版本编译时间更快,但是现在我们仍然坚持使用Visual Studio.Net 2003.在GCC上编译(与Ubuntu 8.04捆绑在一起)总是需要几微秒。

3 个答案:

答案 0 :(得分:2)

我正在使用VC ++ 2003,它在调试/发布模式下立即编译。

修改

您的系统上是否安装了最新的Service Pack?

答案 1 :(得分:2)

说实话,我不太确定代码那么好。它里面有一种难闻的气味。即,这个功能:

unsigned int i4_xor ( unsigned int i, unsigned int j )

//****************************************************************************80
//
//  Purpose:
//
//    I4_XOR calculates the exclusive OR of two integers.
//
//  Modified:
//
//    16 February 2005
//
//  Author:
//
//   John Burkardt
//
//  Parameters:
//
//    Input, unsigned int I, J, two values whose exclusive OR is needed.
//
//    Output, unsigned int I4_XOR, the exclusive OR of I and J.
//
{
  unsigned int i2;
  unsigned int j2;
  unsigned int k;
  unsigned int l;

  k = 0;
  l = 1;

  while ( i != 0 || j != 0 )
  {
    i2 = i / 2;
    j2 = j / 2;

    if ( 
      ( ( i == 2 * i2 ) && ( j != 2 * j2 ) ) ||
      ( ( i != 2 * i2 ) && ( j == 2 * j2 ) ) )
    {
      k = k + l;
    }

    i = i2;
    j = j2;
    l = 2 * l;
  }

  return k;
}

也有i8_xor。还有几个abs功能。

我认为DailyWTF的帖子是有序的。

编辑:对于非c程序员,这里有一个快速指导上面的内容:

function xor i:unsigned, j:unsigned
  answer = 0
  bit_position = 1
  while i <> 0 or j <> 0
    if least significant bit of i <> least significant bit of j
      answer = answer + bit_position 
    end if
    bit_position = bit_position * 2
    i = i / 2
    j = j / 2
  end while
  return answer
end function

要确定是否设置或清除了最低有效位,请使用以下内容:

bit set if i <> (i / 2) * 2
bit clear if i == (i / 2) * 2

使代码更加WTFy的原因是C定义了一个XOR运算符,即'^'。所以,而不是:

result = i4_xor (a, b);

你可以:

result = a ^ b; // no function call at all!

原始程序员真的应该知道xor运算符。但即使他们没有(并且授予它,这是另一个混​​淆的C符号),他们对XOR函数的实现也是令人难以置信的差。

答案 2 :(得分:1)

我建议您下载Visual Studio 2008的试用版并在那里尝试编译,只是为了查看问题是否是固有的。此外,如果 在当前版本上发生,您将能够报告问题,Microsoft可能会修复它。

另一方面,微软将没有机会修复VS2003中的任何错误。