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

3

我的团队需要“Sobol准随机数生成器”——一种常用的RNG,以其良好的质量结果和操作速度而闻名。我在网上找到了一个看起来简单的C语言实现在家里,我能够使用Linux GCC编译器几乎瞬间编译它。

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

为什么?

我知道“发布”模式会触发一些编译器优化...但是这么小的文件怎么可能花费如此长的时间进行优化呢?它主要是注释和静态数据。几乎没有值得优化的东西。

这些电脑都不算特别慢,而且无论如何,我知道编译时间在各种Windows计算机上都是一致的。我还听说新版本的Visual Studio具有更快的编译时间,但是目前我们只能使用Visual Studio.Net 2003。在GCC上编译(Ubuntu 8.04捆绑的那个)总是需要微秒级。

3个回答

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

代码变得更加混乱的原因是C语言定义了一个异或运算符'^'。所以,代码可以写成:
result = i4_xor (a, b);

你可以拥有:

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

原始程序员应该知道异或运算符。即使他们不知道(并且可以理解,这是另一个混淆的C语言符号),他们对异或函数的实现非常糟糕。

我主要是一名Python开发人员,所以这对我来说看起来像无意义的东西……除了代码晦涩难懂之外,它实际上有什么问题? - Salim Fadhley
这些注释说这段代码是从Fortran 77移植过来的。Fortran 77有一个XOR运算符吗? - bk1e

2

我正在使用VC++ 2003,它能够在debug/release模式下立即编译通过。

编辑:

您的系统是否安装了最新的服务包?


1
我建议您下载 Visual Studio 2008 的试用版并尝试在那里编译,以查看问题是否固有。此外,如果它在当前版本上发生,您将能够报告问题,微软可能会修复它。
另一方面,微软不可能修复 VS2003 中存在的任何错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接