Biên dịch dài Visual Studio khi thay thế int bằng double


86

Bản sao VS2013 Ultimate của tôi biên dịch mã này trong hơn 60 giây:

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

Nhưng nếu tôi thay thế doublebằng int, nó sẽ biên dịch ngay lập tức. Làm thế nào nó có thể được giải thích ...?


Biên dịch ngay trên máy của tôi, cho cả hai kiểu dữ liệu ... Bạn đang biên dịch nó trên máy nào?
Chris Mantle

1
Cào bình luận đầu tiên của tôi; Tôi đang thấy hành vi tương tự. ~ 15 giây với doublevà tức thì với int. Máy 3,4Ghz.
Kevin Richardson

Hấp dẫn. Tôi đã kiểm tra phiên bản của mình và thực sự tôi đang chạy VS2013 Premium - nghĩ rằng tôi đã cài đặt Ultimate. Có lẽ nó chỉ là phiên bản Ultimate mà điều này xảy ra với.
Chris Mantle

1
@chris Chỉ để hỗ trợ giả thuyết đó, VS Express 2013 / Windows Desktop biên dịch nó tốt.
ClickRick

5
Từ những gì tôi đã nghe, "hành vi rất lạ của VS2013" hầu như không phải là một điều kỳ lạ. :)
Lightness Races ở Orbit

Câu trả lời:


140

Tôi repro, 27 giây trên máy của tôi. Kẻ ác là MsMpEng.exe, nó đốt 100% lõi trong thời gian dài. Dễ dàng nhìn thấy trong tab Processes của Task Manager.

Đây là dịch vụ Windows Defender, một dịch vụ thực sự thực hiện quét phần mềm độc hại. Tắt tính năng này bằng cách bỏ chọn tùy chọn "Bật bảo vệ thời gian thực" sẽ khắc phục ngay sự chậm trễ. Việc thêm đường dẫn nơi tôi lưu trữ các dự án vào hộp "Vị trí tệp bị loại trừ" cũng vậy, có thể là cách tiếp cận ưa thích của bạn.

Tôi không muốn phải đoán lý do cơ bản, nhưng phải giả định rằng mã nguồn của bạn đang kích hoạt quy tắc phần mềm độc hại. Không phải là một lời giải thích tuyệt vời, tôi không thấy độ trễ khi nhắm mục tiêu phiên bản .NET <4.0. Được rồi, tôi từ bỏ :)


4
Omg, Microsoft, bạn đang đùa tôi ... Tnx để được giúp đỡ, nó thực sự MSSE.Net 4.0+là người thủ phạm
Alex Zhukovskiy

3
Nắm bắt tốt! Tôi đang tự hỏi điều gì chính xác gây ra sự cố (đặc biệt là đối với một chương trình quá đơn giản và hầu như không chứa các phụ thuộc bên ngoài). Có thể nào kết quả byte MSIL từ quá trình biên dịch sẽ giống hệt như một mẫu của một phần mềm độc hại đã biết và do đó MsMpEnd sẽ kích hoạt?
tigrou

-1

Tôi không thể nói một cách có thẩm quyền vì đã hơn 20 năm kể từ khi tôi tìm hiểu ở cấp độ mã lắp ráp, nhưng tôi có thể dễ dàng tin vào điều này.

Sự khác biệt giữa các hoạt động dấu phẩy động tiêu chuẩn IEEE và các hoạt động do bộ xử lý thực hiện thường buộc liên kết trong các quy trình thư viện để thực hiện việc dịch, trong khi phép toán số nguyên có thể chỉ sử dụng các lệnh CPU. Vào thời điểm IEEE xác định tiêu chuẩn, họ đã đưa ra một số lựa chọn rất không phổ biến trong việc triển khai, và đặc biệt là từ lâu, việc triển khai trong vi mã sẽ đắt hơn nhiều và tất nhiên các hệ thống PC hiện tại được xây dựng dựa trên các chip hậu duệ của 80387 và 80486 , có trước tiêu chuẩn.

Vì vậy, nếu tôi đúng, thời gian tăng lên là do nó liên quan đến việc thêm một đoạn mã thư viện vào liên kết và liên kết là một phần lớn của thời gian xây dựng có xu hướng tăng lên gấp bội khi các phần có thể di chuyển được thêm vào.

Clang trên Linux có thể có hoặc không cùng một tốc độ chậm; nếu nó tránh nó và mở rộng phỏng đoán của tôi hơn nữa, đó sẽ là một tạo tác của libc bộ nhớ được chia sẻ khắp nơi mà bạn có ở đó và tối ưu hóa trình liên kết xung quanh điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.