用double替换int时Visual Studio长时间编译


86

我的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;
    }
}

但是,如果我替换doubleint,它会立即编译。怎么解释...?


对于两种数据类型,都可以立即在我的计算机上编译...您正在哪台计算机上编译它?
克里斯·曼特勒

1
刮开我的第一条评论;我看到了相同的行为。使用约15秒,使用double立即int。3.4Ghz机。
凯文·理查森

有趣。我检查了版本,然后实际上正在运行VS2013 Premium-以为我已安装Ultimate。也许这只是最终版本。
克里斯·曼特尔

1
@chris为了支持该假设,VS Express 2013 / Windows Desktop对其进行了很好的编译。
ClickRick

5
据我所知,“ VS2013非常奇怪的行为”并不是什么奇怪的事情。:)
2014年

Answers:


140

我在机器上播放了27秒。邪恶的人是MsMpEng.exe,它燃烧了100%的核心时间。在任务管理器的“进程”选项卡中易于查看。

这是Windows Defender服务,该服务实际执行恶意软件扫描。通过取消选中“打开实时保护”选项来禁用它可以立即修复延迟。将我存储项目的路径添加到“排除的文件位置”框中也是如此,这可能是您首选的方法。

我不愿猜测其根本原因,但必须假设您的源代码正在触发恶意软件规则。这不是一个很好的解释,当我针对.NET版本<4.0时,看不到延迟。好吧,我放弃:)


4
OMG,微软,你在开玩笑吗?TNX的帮助,它的真正的MSSE.Net 4.0+谁是罪魁祸首
亚历克斯·茹科夫斯基

3
接得好!我想知道到底是什么引起了该问题(特别是对于一个如此简单并且几乎不包含外部依赖项的程序)。编译产生的MSIL字节结果看起来完全像是已知恶意软件的模式,从而MsMpEnd会启动吗?
tigrou 2014年

-1

我不能说权威,因为自从我在汇编代码级别上花了20多年的时间以来,但是我可以轻易相信这一点。

IEEE标准浮点运算与处理器实现的浮点运算之间的差异通常会迫使库例程中的链接进行转换,而整数数学只能使用CPU指令。在IEEE定义标准时,他们做出了一些在实施中并不常见的选择,尤其是很久以前,以微码实现的成本更高,当然,当前的PC系统是基于80387和80486衍生的芯片构建的,它早于标准。

因此,如果我是对的,那么增加的时间是因为它涉及到向链接添加一大段库代码,而链接是构建时间的很大一部分,随着可重定位块的添加,链接往往会成倍增长。

Linux上的Clang可能会或可能不会有相同的速度下降;如果它确实避免了这种情况,并且进一步扩大了我的猜测,那将是无处不在的共享内存libc的产物,并且在那里进行了链接程序优化。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.