İnt'i double ile değiştirirken uzun görsel stüdyo derlemesi


86

VS2013 Ultimate kopyam bu kodu 60 saniyeden fazla derliyor:

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

Ama doubleile değiştirirsem int, hemen derlenir. Nasıl açıklanabilir ...?


Her iki veri türü için hemen makinemde derler ... Onu hangi makinede derliyorsunuz?
Chris Mantle

1
İlk yorumumu karalayın; Ben de aynı davranışı görüyorum. ~ 15 saniye ile doubleve anında ile int. 3.4Ghz makinesi.
Kevin Richardson

İlginç. Sürümümü kontrol ettim ve aslında VS2013 Premium çalıştırıyorum - Ultimate'ı yüklediğimi düşündüm. Belki de bunun ortaya çıktığı sadece Ultimate sürümüdür.
Chris Mantle

1
@chris Bu hipotezi desteklemek için, VS Express 2013 / Windows Masaüstü bunu gayet iyi derliyor.
ClickRick

5
Duyduğuma göre, "VS2013 çok tuhaf davranış" pek tuhaf değil. :)
Orbit'te Hafiflik Yarışları

Yanıtlar:


140

Makinemde 27 saniye repro yapıyorum. Kötülük yapan MsMpEng.exe'dir, o kadar uzun süre% 100 çekirdek yakar. Görev Yöneticisinin İşlemler sekmesinde görmek kolaydır.

Bu, kötü amaçlı yazılım taramalarını gerçekten gerçekleştiren Windows Defender hizmetidir. "Gerçek zamanlı korumayı aç" seçeneğinin işaretini kaldırarak devre dışı bırakmak, gecikmeyi anında düzeltir. Muhtemelen tercih ettiğiniz yaklaşım olan "Hariç tutulan dosya konumları" kutusuna projeleri depoladığım yolu eklemek de öyle.

Altta yatan nedeni tahmin etmekten nefret ederim, ancak kaynak kodunuzun bir kötü amaçlı yazılım kuralını tetiklediğini varsaymak zorundayım. Harika bir açıklama değil, <4.0 .NET sürümünü hedeflediğimde gecikme görmüyorum. Tamam pes ediyorum :)


4
Omg, Microsoft, benimle dalga geçiyorsun ... Yardım için Tnx, gerçekten MSSEve .Net 4.0+suçlu kimler
Alex Zhukovskiy

3
İyi yakalama! Soruna tam olarak neyin neden olduğunu merak ediyorum (özellikle çok basit olan ve neredeyse hiç harici bağımlılıklar içermeyen bir program için). Derlemeden kaynaklanan MSIL baytlarının tam olarak bilinen bir kötü amaçlı yazılım kalıbı gibi görünmesi ve dolayısıyla MsMpEnd'in tetiklenmesi mümkün olabilir mi?
tigrou

-1

Yetkili olarak söyleyemem çünkü montaj kodu seviyesinde oynadığımdan beri 20+ yıl geçti, ancak buna kolayca inanabilirim.

IEEE standart kayan nokta operasyonları ile bir işlemci tarafından uygulananlar arasındaki fark, çeviriyi yapmak için kütüphane rutinlerinde bağlantı kurmaya zorlarken, tamsayı matematik sadece CPU komutlarını kullanabilir. IEEE standardı tanımladığında, uygulamada çok nadir olan ve özellikle uzun zaman önce mikrokodda uygulanması çok daha pahalı olan bazı seçimler yaptılar ve elbette mevcut PC sistemleri 80387 ve 80486'dan gelen yongalar etrafında inşa edildi. , standarttan önce gelen.

Öyleyse, haklıysam, artan zaman, bağlantıya bir yığın kitaplık kodu eklemeyi içermesi ve bağlantı oluşturma süresinin büyük bir kısmı, yeniden yerleştirilebilir parçalar eklendikçe katlanarak büyüme eğilimi göstermesidir.

Linux'ta Clang aynı yavaşlamaya sahip olabilir veya olmayabilir; eğer bundan kaçınırsa ve benim tahminlerimi daha da genişletirse, bu, her yerde bulunan paylaşılan bellek libc'nin ve bunun etrafındaki bağlayıcı optimizasyonlarının bir eseri olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.