int를 double로 바꿀 때 Visual Studio 긴 컴파일


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


두 데이터 유형 모두 내 컴퓨터에서 즉시 컴파일합니다. 어떤 컴퓨터에서 컴파일하고 있습니까?
Chris Mantle

1
내 첫 번째 댓글을 긁어주세요. 나는 같은 행동을보고있다. ~ 15 초 doubleint. 3.4Ghz 기계.
Kevin Richardson

흥미 롭군. 내 버전을 확인했고 실제로 VS2013 Premium을 실행하고 있습니다. Ultimate가 설치되어 있다고 생각했습니다. 아마도 이것이 발생하는 것은 궁극적 인 버전 일 것입니다.
Chris Mantle

1
@chris 그 가설을 지원하기 위해 VS Express 2013 / Windows Desktop은 잘 컴파일합니다.
ClickRick 2014-06-07

5
내가들은 바에 따르면 "VS2013 매우 이상한 행동"은 이상하지 않습니다. :)
궤도의 Lightness Races 2014 년

답변:


140

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

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

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


4
OMG, 마이크로 소프트는, 당신은 진정으로 도움을 저 ... TNX을 것 농담 MSSE.Net 4.0+범인이 누군지
알렉스 쥬 코브 스키

3
잘 잡아! 문제의 원인이 정확히 무엇인지 궁금합니다 (특히 매우 간단하고 외부 종속성이 거의없는 프로그램의 경우). 컴파일 결과 MSIL 바이트가 알고있는 악성 코드의 패턴과 똑같아 서 MsMpEnd가 실행될 가능성이 있습니까?
tigrou 2014-06-07

-1

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.