문제

MAXTLY 연산자가 Math.Pow 메소드를 사용하는 것보다 빠른지 아는 사람이 있습니까? 처럼:

n * n * n

vs

Math.Pow ( n, 3 )
도움이 되었습니까?

해결책

기본적으로, 당신은해야합니다 기준 보다.

교육받은 추측 (신뢰할 수없는) :

일부 컴파일러에 의해 같은 것에 최적화되지 않은 경우 ...

그럴 가능성이 큽니다 x * x * x 보다 빠릅니다 Math.Pow(x, 3) ~처럼 Math.Pow 일반적인 경우 문제를 다루어야하며, 분수 권력 및 기타 문제를 다루는 반면 x * x * x 몇 가지 곱하기 지시 사항을 사용하므로 더 빠를 가능성이 높습니다.

다른 팁

방금 Windows를 다시 설치하여 Visual Studio가 설치되지 않고 코드가 추악합니다.

using System;
using System.Diagnostics;

public static class test{

public static void Main(string[] args){
    MyTest();
    PowTest();
}

static void PowTest(){
    var sw = Stopwatch.StartNew();
    double res = 0;
    for (int i = 0; i < 333333333; i++){
        res = Math.Pow(i,30); //pow(i,30)
    }
    Console.WriteLine("Math.Pow: " + sw.ElapsedMilliseconds + " ms:  " + res);
}

static void MyTest(){
    var sw = Stopwatch.StartNew();
    double res = 0;
    for (int i = 0; i < 333333333; i++){
        res = MyPow(i,30);
    }
    Console.WriteLine("MyPow: " + sw.ElapsedMilliseconds + " ms:  " + res);
}



static double MyPow(double num, int exp)
{
    double result = 1.0;
    while (exp > 0)
    {
        if (exp % 2 == 1)
            result *= num;
        exp >>= 1;
        num *= num;
    }

    return result;
}
}

결과 :
CSC /O TEST.CS

test.exe

MyPow: 6224 ms:  4.8569351667866E+255  
Math.Pow: 43350 ms:  4.8569351667866E+255 

사각형에 의한 지수 (참조 https://stackoverflow.com/questions/101439/the-most-efficient-way-to-implement-an-integer-power-function-powint-int)는 내 테스트에서 수학보다 훨씬 빠릅니다 (내 CPU는 2GHz at Pentium T3200입니다)

편집 : .NET 버전은 3.5 SP1이고 OS는 Vista SP1이고 전력 계획은 고성능입니다.

이미지 처리 및 과학 컴퓨팅에서 10 년 이상의 최적화에서 몇 가지 규칙 :

알고리즘 레벨에서의 최적화는 낮은 수준에서 모든 최적화를 능가합니다. "명백한 글을 쓰고, 최적화 한 다음 최적화"에도 불구하고, 이것은 처음에 이루어져야한다. 후에.

핸드 코딩 된 수학 작업 (특히 SIMD SSE+ 유형)은 일반적으로 확인 된 전체 오류, 일반화 된 내장 내장보다 성능이 우수합니다.

컴파일러가 미리 알고있는 작업을 미리 알고있는 작업은 컴파일러에 의해 최적화됩니다. 여기에는 다음이 포함됩니다. 1. Array.copy ()와 같은 메모리 작업 2. 배열 길이가 제공되는 어레이 위의 루프의 경우. for (for)..; i<array.Length;..)

항상 비현실적인 목표를 설정하십시오 (원하는 경우).

방금 어제 이것을 테스트 한 다음 지금 질문을 보았습니다.

내 컴퓨터에서는 1 테스트 스레드를 실행하는 코어 2 듀오 인 Core 2 듀오를 사용하는 것이 더 빠릅니다.

그러나 2의 계수에도 결과는 종종 동일하지 않습니다. 반올림 오류가 있습니다.

일부 알고리즘은 반올림 오류에 매우 민감합니다. 나는 이것을 발견 할 때까지 문자 그대로 백만 건 이상의 임의의 테스트를 실행해야했습니다.

나는 확인했다 Math.Pow() 두 개의 복식을 취하도록 정의됩니다. 이것은 반복 된 곱셈을 할 수 없지만보다 일반적인 접근법을 사용해야한다는 것을 의미합니다. 있다면 Math.Pow(double, int), 아마도 더 효율적 일 수 있습니다.

즉, 성능 차이는 거의 확실히 사소한 것이므로, 당신은 어느 쪽이든 더 명확한 것을 사용해야합니다. 이와 같은 미세 최적화는 거의 항상 무의미하며 거의 언제라도 도입 될 수 있으며 개발 프로세스가 끝날 때까지 남겨 두어야합니다. 그 시점에서, 당신은 소프트웨어가 너무 느린 지, 핫스팟이있는 곳에 있는지 확인하고 실제로 차이를 만들 수있는 미세 최적화 노력을 소비 할 수 있습니다.

이것은 너무 마이크로이므로 특정 플랫폼에 대해 벤치마킹해야 할 것입니다. Pentium Pro의 결과가 ARM 또는 Pentium II와 반드시 동일 할 것이라고 생각하지 않습니다.

대체로 전혀 관련이있을 가능성이 가장 높습니다.

컨벤션 x^n을 사용합시다. n이 항상 정수라고 가정합시다.

N의 작은 값의 경우 Math.pow (아마도 구현 의존적)가 멋진 알고리즘을 사용하여 N이 비 용도 및/또는 음수가 될 수 있으므로 지루한 곱셈이 더 빠릅니다.

N의 큰 값의 경우 Math.pow가 더 빠를 수 있지만 라이브러리가 매우 똑똑하지 않은 경우 동일한 알고리즘을 사용합니다. N 항상 정수라는 것을 알고 있다면 이상적이지 않습니다. 이를 위해 구현을 코딩 할 수 있습니다 사각형에 의한 지수 또는 다른 멋진 알고리즘.

물론 최신 컴퓨터는 매우 빠르며 프로그램을 벤치마킹 할 때까지 가장 간단하고 읽기 쉬운 가장 간단하고 가장 쉽게 읽을 수 있으며 다른 알고리즘을 사용하여 상당한 속도를 높일 수 있다고 확신합니다.

나는 수제 기능이 항상 더 빠르다는 것에 동의하지 않습니다. 코사인 기능은 내가 쓸 수있는 것보다 훨씬 빠르고 정확합니다. pow ()에 관해서는. Mehrdad가 추측에 대해 경고했기 때문에 Math.pow ()가 JavaScript에 얼마나 느린 지 확인하기 위해 빠른 테스트를 수행했습니다.

    for (i3 = 0; i3 < 50000; ++i3) { 
      for(n=0; n < 9000;n++){ 
        x=x*Math.cos(i3);
      }
    }

결과는 다음과 같습니다.

Each function run 50000 times 

time for 50000 Math.cos(i) calls = 8 ms 
time for 50000 Math.pow(Math.cos(i),9000) calls = 21 ms 
time for 50000 Math.pow(Math.cos(i),9000000) calls = 16 ms 
time for 50000 homemade for loop calls 1065 ms

동의하지 않으면 프로그램을 사용해보십시오 http://www.m0ose.com/javascripts/speedtests/powspeedtest.html

Math.Pow(x, y) 일반적으로 내부적으로 계산됩니다 Math.Exp(Math.Log(x) * y). Evey Power 방정식은 자연 로그, 곱셈 및 상승을 찾아야합니다. e 힘에.

이전 답변에서 언급했듯이 10의 힘만으로 Math.Pow() 일련의 곱셈을 사용하면 더 빨라지지만 정확도는 손상됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top