web-dev-qa-db-ja.com

intをdoubleに置き換えると、Visual Studioの長いコンパイル

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に置き換えると、すぐにコンパイルされます。どのように説明できますか...?

85
Alex Zhukovskiy

私は自分のマシンで27秒間再現します。悪意のあるユーザーはMsMpEng.exeで、その間100%コアを焼きます。タスクマネージャーの[プロセス]タブで簡単に確認できます。

これはWindows Defenderサービスで、実際にマルウェアスキャンを実行します。 [リアルタイム保護を有効にする]オプションをオフにして無効にすると、遅延が即座に修正されます。また、プロジェクトを保存するパスを[除外されたファイルの場所]ボックスに追加することもできます。

根本的な理由を推測する必要はありませんが、ソースコードがマルウェアルールをトリガーしていると想定する必要があります。すばらしい説明ではありませんが、.NETバージョン<4.0を対象とした場合の遅延はわかりません。さて、私はあきらめます:)

139
Hans Passant