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

Posted

技术标签:

【中文标题】为啥在 VCC 2003 中编译需要这么长时间?【英文标题】:Why does this take so long to compile in VCC 2003?为什么在 VCC 2003 中编译需要这么长时间? 【发布时间】:2009-03-12 11:43:25 【问题描述】:

我的团队需要“Sobol quasi-random number generator”——一种以高质量结果和运行速度而闻名的通用 RNG。我找到了what looks like a simple C implementation on the web。在家里,我几乎可以使用我的 Linux GCC 编译器立即编译它。

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

为什么?

我知道“发布”模式会触发一些编译器优化...但是这么小的文件到底怎么会花这么长时间来优化呢?它主要是 cmets 和静态数据。几乎没有什么值得优化的。

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

【问题讨论】:

【参考方案1】:

老实说,我不太确定这些代码有多好。里面有一股难闻的味道。即这个函数:

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 函数的实现也非常糟糕。

【讨论】:

我主要是一名 python 开发人员,所以这对我来说似乎是无稽之谈......除了这段代码的一般不可读性之外,它实际上有什么问题? cmets 说这段代码是从 Fortran 77 移植过来的。Fortran 77 有 XOR 运算符吗?【参考方案2】:

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

编辑:

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

【讨论】:

【参考方案3】:

我建议您下载 Visual Studio 2008 的试用版并尝试在那里进行编译,看看问题是否与生俱来。此外,如果它确实在当前版本上发生,您将能够报告该问题,Microsoft 可能会修复它。

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

【讨论】:

以上是关于为啥在 VCC 2003 中编译需要这么长时间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个查询需要这么长时间?

为啥'withColumn'在pyspark中需要这么长时间?

为啥在 NAS 上“移动目录”需要这么长时间?

为啥 BigQuery API 调用需要这么长时间?

为啥 SQLite 需要这么长时间来获取数据?

为啥这个 tensorflow 训练需要这么长时间?