C# 나눗셈이 곱셈보다 느린 이유는 무엇입니까?

프로그래밍 언어, 특히 C#에는 덧셈, 뺄셈, 곱셈, 나눗셈이라는 4가지 산술 연산을 수행할 수 있습니다.

그리고 외부 관점에서 볼 때 성능 면에서는 모두 비슷해 보일 수 있지만 그 중 하나가 나머지 3개에 비해 훨씬 느린 것으로 나타났습니다.

어느 것이 더 느린지 물어볼 수 있습니까? 구분.

이 HP 문서에 따르면:

부동 소수점 나눗셈과 제곱근은 덧셈과 곱셈보다 계산 시간이 상당히 오래 걸립니다. 후자의 두 개는 직접 계산되는 반면 전자는 일반적으로 반복 알고리즘으로 계산됩니다. 가장 일반적인 접근 방식은 나누기 없는 Newton-Raphson 반복을 사용하여 분모의 역수(나누기) 또는 역수 제곱근에 대한 근사치를 구한 다음 분자(나누기) 또는 입력 인수(제곱근)를 곱하는 것입니다..

위의 내용을 확인하기 위해 아래 코드를 사용하여 간단한 테스트를 실행하기로 결정했습니다.

        //Generate two random numbers
        var rand = new System.Random();
        float a = rand.Next();
        float b = rand.Next();

        Debug.Log("Number a: " + a + " Number b: " + b);

        System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();

        watch.Start();
        //Addition
        for (int i = 1; i < 1000000; i++)
        {
            float tmp = a + b;
        }
        watch.Stop();
        //Output
        Debug.Log("Addition took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");

        watch.Reset();
        watch.Start();
        //Subtraction
        for (int i = 1; i < 1000000; i++)
        {
            float tmp = a - b;
        }
        watch.Stop();
        //Output
        Debug.Log("Subtraction took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");

        watch.Reset();
        watch.Start();
        //Multiplication
        for (int i = 1; i < 1000000; i++)
        {
            float tmp = a * b;
        }
        watch.Stop();
        //Output
        Debug.Log("Multiplication took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");

        watch.Reset();
        watch.Start();
        //Division
        for (int i = 1; i < 1000000; i++)
        {
            float tmp = a / b;
        }
        watch.Stop();
        //Division
        Debug.Log("Division took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");

기본적으로 두 개의 난수에 대해 백만 번의 덧셈, 뺄셈, 곱셈, 나눗셈을 실행하고 각각이 처리하는 데 걸린 시간을 측정했으며 테스트를 5번 반복했으며 결과는 다음과 같습니다.

  • 평균 추가 시간은 0.0004초 걸렸습니다.
  • 빼는 데 평균 0.0003초가 걸렸습니다.
  • 평균 곱셈에는 0.0003초가 걸렸습니다.
  • 나누기에 평균 0.0044초가 걸렸습니다.

그 결과 덧셈, 뺄셈, 곱셈은 성능면에서는 비슷하지만 나눗셈은 1100% 정도 느린 것으로 나타났습니다.

작은 차이는 아니며, 가능하다면 나눗셈 대신 곱셈을 사용하는 것이 항상 더 낫다는 결론에 이르게 됩니다. 예를 들어 숫자를 2로 나누어야 할 경우 대신 0.5를 곱하는 것이 가장 좋습니다.

추천 기사
C#에서 Square Root가 느린 작업인 이유는 무엇입니까?
C# 애플리케이션의 포먼트 처리
C#의 다중 스레드 코드에서 데이터 작성 및 검색 가이드
C#이란 무엇입니까?
C# 개발자를 위한 최고의 마우스 가이드
C# 개발자를 위한 최고의 키보드 가이드
C# 개발자를 위한 최고의 노트북 가이드