intをdoubleに置き換える場合のVisualStudioの長いコンパイル


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秒doubleint。で瞬時に。3.4Ghzマシン。
ケビンリチャードソン

面白い。バージョンを確認し、実際にVS2013Premiumを実行しています。Ultimateがインストールされていると思いました。おそらく、これが発生するのはアルティメットバージョンだけです。
クリスマントル2014年

1
@chrisその仮説をサポートするために、VS Express 2013 / WindowsDesktopはそれをうまくコンパイルします。
ClickRick 2014年

5
私が聞いたところによると、「VS2013の非常に奇妙な振る舞い」はほとんど奇妙なことではありません。:)
軌道でのライトネスレース2014年

回答:


140

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

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

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


4
Omg、Microsoft、あなたは私をからかっています...助けを求めるTnx、それは本当にMSSEそして.Net 4.0+誰が犯人であるか
Alex Zhukovskiy

3
いいキャッチ!何が問題を正確に引き起こしているのか疑問に思っています(特に、非常に単純で、外部依存関係がほとんど含まれていないプログラムの場合)。コンパイルの結果のMSILバイトが既知のマルウェアのパターンとまったく同じように見え、MsMpEndが起動する可能性はありますか?
tigrou 2014年

-1

アセンブリコードレベルでいじってから20年以上経っているので、正式に言うことはできませんが、これは簡単に信じられます。

IEEE標準の浮動小数点演算とプロセッサによって実装されたものの違いは、多くの場合、ライブラリルーチンでのリンクに変換を強制しますが、整数演算ではCPU命令のみを使用できます。IEEEが標準を定義したとき、彼らは実装において非常に珍しいいくつかの選択をしました、そして特にずっと前にマイクロコードで実装するのにはるかに高価でした、そしてもちろん現在のPCシステムは80387と80486から派生したチップを中心に構築されています、標準よりも前のものです。

つまり、私が正しいとすれば、時間の増加は、ライブラリコードのチャンクをリンクに追加する必要があるためです。リンクは、再配置可能なチャンクが追加されるにつれて乗算的に増加する傾向があるビルド時間の大部分です。

Linux上のClangでも、同じ速度低下が見られる場合と見られない場合があります。それがそれを回避し、私の推測をさらに拡張する場合、それはあなたがそこに到達する遍在する共有メモリlibcとその周りのリンカー最適化のアーティファクトになるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.