我的团队需要“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捆绑在一起)总是需要几微秒。
答案 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中的任何错误。