为啥在 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 中编译需要这么长时间?的主要内容,如果未能解决你的问题,请参考以下文章