[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;
}
}
내가 대체 그러나 만약 double
에 int
즉시 컴파일합니다. 어떻게 설명 할 수 있을까요 …?
답변
내 컴퓨터에서 27 초 동안 재현합니다. 악을 행하는 사람은 MsMpEng.exe이며, 그 기간 동안 100 % 코어를 태 웁니다. 작업 관리자의 프로세스 탭에서 쉽게 볼 수 있습니다.
이것은 실제로 맬웨어 검사를 수행하는 Windows Defender 서비스입니다. “실시간 보호 켜기”옵션을 선택 해제하여 비활성화하면 지연이 즉시 수정됩니다. 또한 내가 선호하는 방법 인 “제외 된 파일 위치”상자에 프로젝트를 저장하는 경로를 추가합니다.
근본적인 이유를 추측하고 싶지는 않지만 소스 코드가 멀웨어 규칙을 트리거한다고 가정해야합니다. 좋은 설명은 아니지만 .NET 버전 <4.0을 대상으로 할 때 지연이 발생하지 않습니다. 좋아요, 포기합니다 🙂
답변
내가 어셈블리 코드 수준에서 만난 지 20 년이 넘었 기 때문에 권위적으로 말할 수는 없지만 쉽게 믿을 수 있습니다.
IEEE 표준 부동 소수점 연산과 프로세서에 의해 구현 된 연산의 차이로 인해 종종 라이브러리 루틴에서 링크가 변환을 수행하는 반면 정수 수학은 CPU 명령어 만 사용할 수 있습니다. IEEE가 표준을 정의했을 때, 그들은 구현에서 매우 드문 선택을했으며 특히 오래 전에는 마이크로 코드로 구현하는 데 훨씬 더 비용이 많이 들었습니다. 물론 현재 PC 시스템은 80387 및 80486의 후손 칩을 중심으로 구축되었습니다. , 표준 이전입니다.
그래서 내가 맞다면, 시간이 늘어난 것은 링크에 라이브러리 코드 덩어리를 추가하기 때문이며, 링크는 재배치 가능한 덩어리가 추가됨에 따라 배가 증가하는 경향이있는 빌드 시간의 큰 부분입니다.
Linux의 Clang은 동일한 속도 저하를 가질 수도 있고 그렇지 않을 수도 있습니다. 그것이 그것을 피하고 내 추측을 더욱 확장한다면, 그것은 당신이 거기에 도착하는 편재하는 공유 메모리 libc와 그 주변의 링커 최적화의 아티팩트가 될 것입니다.