我的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;
}
}
但是如果我用int
代替double
,它立即编译。怎么解释呢?
在我的机器上显示,27秒。罪魁祸首是MsMpEng.exe,它能在这么长时间内100%燃烧内核。很容易在任务管理器的进程选项卡中看到。
这是Windows Defender服务,它实际上执行恶意软件扫描。通过取消勾选"打开实时保护"选项来禁用它,可以立即修复延迟。将我存储项目的路径添加到"排除的文件位置"框中也是如此,这可能是您首选的方法。
我不愿意猜测潜在的原因,但必须假设您的源代码触发了恶意软件规则。这不是一个很好的解释,当我瞄准。net版本时,我没有看到延迟<4.0. 好吧,我放弃了:)
我不能权威地说,因为我已经20多年没有摆弄汇编代码了,但我可以很容易地相信这一点。
IEEE标准浮点运算与处理器实现的浮点运算之间的差异通常迫使库例程连接来进行转换,而整数数学可以直接使用CPU指令。在IEEE定义标准的时候,他们做了一些在实现中非常不常见的选择,特别是很久以前用微码实现要昂贵得多,当然,当前的PC系统是围绕80387和80486的芯片构建的,这些芯片早于标准。
所以,如果我是对的,增加的时间是因为它涉及到将库代码块添加到链接中,而链接是构建时间的很大一部分,随着可重定位块的添加,构建时间往往会成倍增长。
Clang在Linux上可能有也可能没有同样的减速;如果它确实避免了它,并进一步扩展我的猜测,那将是无处不在的共享内存libc和围绕它的链接器优化的产物。