Kompilasi panjang studio visual saat mengganti int dengan double

86

Salinan VS2013 Ultimate saya mengkompilasi kode ini selama 60+ detik:

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

Tetapi jika saya mengganti doubledengan int, itu segera dikompilasi. Bagaimana bisa dijelaskan ...?

Alex Zhukovskiy
sumber
Segera kompilasi di mesin saya, untuk kedua tipe data ... Mesin apa yang Anda kompilasi?
Chris Mantle
1
Gores komentar pertama saya; Saya melihat perilaku yang sama. ~ 15 detik dengan doubledan instan dengan int. Mesin 3.4Ghz.
Kevin Richardson
Menarik. Saya memeriksa versi saya dan saya benar-benar menjalankan VS2013 Premium - mengira saya telah menginstal Ultimate. Mungkin hanya versi Ultimate yang terjadi dengannya.
Chris Mantle
1
@chris Hanya untuk mendukung hipotesis itu, VS Express 2013 / Windows Desktop mengkompilasinya dengan baik.
ClickRick
5
Dari apa yang saya dengar, "VS2013 perilaku yang sangat aneh" bukanlah suatu keanehan. :)
Balapan Ringan di Orbit

Jawaban:

140

Saya repro, 27 detik di mesin saya. Pelaku jahat adalah MsMpEng.exe, itu membakar 100% inti selama itu. Mudah dilihat di tab Proses Manajer Tugas.

Ini adalah layanan Windows Defender, yang benar-benar melakukan pemindaian malware. Menonaktifkannya dengan menghapus centang pada opsi "Aktifkan perlindungan waktu nyata" secara instan memperbaiki penundaan. Begitu pula dengan menambahkan jalur tempat saya menyimpan proyek ke kotak "Lokasi file yang dikecualikan", mungkin pendekatan yang Anda sukai.

Saya tidak suka menebak alasan yang mendasarinya, tetapi harus berasumsi bahwa kode sumber Anda memicu aturan malware. Bukan penjelasan yang bagus, saya tidak melihat penundaan ketika saya menargetkan versi .NET <4.0. Oke, saya menyerah :)

Hans Passant
sumber
4
Omg, Microsoft, Anda bercanda ... Tnx untuk bantuan, itu benar-benar MSSEdan .Net 4.0+siapa pelakunya
Alex Zhukovskiy
3
Tangkapan yang bagus! Saya bertanya-tanya apa sebenarnya yang menyebabkan masalah (terutama untuk program yang sangat sederhana dan hampir tidak berisi dependensi eksternal). Apakah mungkin bahwa byte MSIL hasil dari kompilasi akan terlihat persis seperti pola malware yang diketahui dan dengan demikian MsMpEnd akan aktif?
tigrou
-1

Saya tidak bisa mengatakannya secara resmi karena sudah 20+ tahun sejak saya mengutak-atik level kode assembly, tetapi saya dapat dengan mudah mempercayai ini.

Perbedaan antara operasi floating point standar IEEE dan yang diimplementasikan oleh prosesor sering memaksa penautan dalam rutinitas perpustakaan untuk melakukan terjemahan, sedangkan matematika integer hanya dapat menggunakan instruksi CPU. Pada saat IEEE menetapkan standar, mereka membuat beberapa pilihan yang sangat tidak umum dalam penerapannya, dan terutama yang jauh lebih mahal untuk diterapkan di microcode, dan tentu saja sistem PC saat ini dibangun di sekitar chip turunan dari 80387 dan 80486 , yang mendahului standar.

Jadi jika saya benar, peningkatan waktu adalah karena ini melibatkan penambahan potongan kode perpustakaan ke tautan, dan penautan adalah bagian besar dari waktu pembuatan yang cenderung tumbuh secara multiplikatif saat potongan yang dapat dipindahkan ditambahkan.

Clang di Linux mungkin mengalami atau mungkin tidak mengalami pelambatan yang sama; jika itu memang menghindarinya, dan memperluas dugaan saya lebih jauh, itu akan menjadi artefak dari libc memori bersama yang ada di mana-mana yang Anda dapatkan di sana dan pengoptimalan penaut di sekitarnya.

weregamer
sumber