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

我的团队需要“Sobol准随机数字发生器” – 一个以优质结果和运行速度而闻名的常见RNG。 我发现在networking上看起来像一个简单的C实现 。 在家里,我几乎可以用我的Linux GCC编译器立即进行编译。

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

为什么?

我知道“释放”模式会触发一些编译器优化…但是这个小文件究竟要花多长时间才能优化呢? 这主要是评论和静态数据。 几乎没有什么值得优化的。

这些电脑都不是特别慢,在任何情况下我都知道在一系列Windows电脑上编译时间是一致的。 我也听说Visual Studio的新版本有更快的编译时间,但是现在我们被困在Visual Studio.Net 2003中。在GCC(与Ubuntu 8.04捆绑在一起)上编译总是需要几微秒。

说实话,我不太确定那些代码好不好。 它有一个讨厌的气味。 即,这个功能:

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! 

原来的程序员真的应该知道异或运算符。 但是,即使他们没有(并且被认为是另一个混​​淆的C符号),他们实现XOR函数的能力却令人难以置信。

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

编辑:

你的系统上安装了最新的服务包吗?

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

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