[c#] 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즉시 컴파일합니다. 어떻게 설명 할 수 있을까요 …?



답변

내 컴퓨터에서 27 초 동안 재현합니다. 악을 행하는 사람은 MsMpEng.exe이며, 그 기간 동안 100 % 코어를 태 웁니다. 작업 관리자의 프로세스 탭에서 쉽게 볼 수 있습니다.

이것은 실제로 맬웨어 검사를 수행하는 Windows Defender 서비스입니다. “실시간 보호 켜기”옵션을 선택 해제하여 비활성화하면 지연이 즉시 수정됩니다. 또한 내가 선호하는 방법 인 “제외 된 파일 위치”상자에 프로젝트를 저장하는 경로를 추가합니다.

근본적인 이유를 추측하고 싶지는 않지만 소스 코드가 멀웨어 규칙을 트리거한다고 가정해야합니다. 좋은 설명은 아니지만 .NET 버전 <4.0을 대상으로 할 때 지연이 발생하지 않습니다. 좋아요, 포기합니다 🙂


답변

내가 어셈블리 코드 수준에서 만난 지 20 년이 넘었 기 때문에 권위적으로 말할 수는 없지만 쉽게 믿을 수 있습니다.

IEEE 표준 부동 소수점 연산과 프로세서에 의해 구현 된 연산의 차이로 인해 종종 라이브러리 루틴에서 링크가 변환을 수행하는 반면 정수 수학은 CPU 명령어 만 사용할 수 있습니다. IEEE가 표준을 정의했을 때, 그들은 구현에서 매우 드문 선택을했으며 특히 오래 전에는 마이크로 코드로 구현하는 데 훨씬 더 비용이 많이 들었습니다. 물론 현재 PC 시스템은 80387 및 80486의 후손 칩을 중심으로 구축되었습니다. , 표준 이전입니다.

그래서 내가 맞다면, 시간이 늘어난 것은 링크에 라이브러리 코드 덩어리를 추가하기 때문이며, 링크는 재배치 가능한 덩어리가 추가됨에 따라 배가 증가하는 경향이있는 빌드 시간의 큰 부분입니다.

Linux의 Clang은 동일한 속도 저하를 가질 수도 있고 그렇지 않을 수도 있습니다. 그것이 그것을 피하고 내 추측을 더욱 확장한다면, 그것은 당신이 거기에 도착하는 편재하는 공유 메모리 libc와 그 주변의 링커 최적화의 아티팩트가 될 것입니다.


답변