我的VS2013 Ultimate副本将此代码编译60秒以上:
class Program
{
static void Main(string[] args)
{
double dichotomy = Dichotomy(
d =>
{
try
{
int size = (int) d;
byte[] b = new byte[size];
return -b.Length;
}
catch (Exception)
{
return 0;
}
},
0,
int.MaxValue,
1);
Console.WriteLine(dichotomy);
Console.ReadKey();
}
private static double Dichotomy(
Func<double, double> func,
double a,
double b,
double epsilon)
{
double delta = epsilon / 10;
while (b - a >= epsilon)
{
double middle = (a + b) / 2;
double lambda = middle - delta, mu = middle + delta;
if (func(lambda) < func(mu))
b = mu;
else
a = lambda;
}
return (a + b) / 2;
}
}
但如果我用double
替换int
,它会立即编译。怎么解释......?
答案 0 :(得分:34)
我责备,在我的机器上27秒。恶魔是MsMpEng.exe,它长达100%的核心。在“任务管理器”的“进程”选项卡中很容易看到。
这是Windows Defender服务,实际执行恶意软件扫描的服务。通过取消&#34;打开实时保护来禁用它&#34;选项立即修复延迟。那么添加我将项目存储到&#34;排除的文件位置的路径&#34;盒子,可能是你喜欢的方法。
我不得不猜测潜在的原因,但必须假设您的源代码触发了恶意软件规则。不是一个很好的解释,我没有看到我的目标是.NET版本时的延迟&lt; 4.0。好的,我放弃了:))
答案 1 :(得分:0)
我不能说权威,因为自从我在汇编代码级别上摆弄已经20多年了,但是我可以轻易相信这一点。
IEEE标准浮点运算与处理器实现的浮点运算之间的差异通常会迫使库例程中的链接进行转换,而整数数学只能使用CPU指令。在IEEE定义标准时,他们做出了一些在实施中并不常见的选择,尤其是很久以前,以微码实现的成本更高,当然,当前的PC系统是围绕80387和80486衍生的芯片构建的,这早于标准。
所以,如果我是对的,那么增加的时间是因为它涉及到向链接添加大量库代码,并且链接是构建时间的很大一部分,随着可重定位块的添加,链接的数量往往成倍增长。
Linux上的Clang变慢速度可能相同,也可能不同。如果它确实避免了这种情况,并且进一步扩大了我的猜测,那将是您到处无所不在的共享内存libc以及围绕该链接器进行优化的产物。