OpenCV, HALCON 등을 확장하는 n 개의 이미지 처리 라이브러리에서 작업하고 있습니다. 라이브러리는 .NET Framework 3.5와 함께 있어야하며 .NET에 대한 경험이 제한되어 있으므로 성능과 관련하여 몇 가지 질문을하고 싶습니다.Math.Pow의 모범 사례
필자는 자신에게 올바르게 설명 할 수없는 몇 가지 특정 사항에 직면했으며, 왜 그런지와 b) 사례를 다루는 가장 좋은 방법은 무엇인지 물어보기를 바랍니다.
첫 번째 질문은 Math.pow에 관한 것입니다. StackOverflow에서 이미 (a) 꽤 잘 설명하고 있지만 (b)에 대해서는 어떻게하지 않는지에 대한 해답을 이미 찾았습니다. 이
Stopwatch watch = new Stopwatch(); // from the Diagnostics class
watch.Start();
for (int i = 0; i < 1000000; i++)
double result = Math.Pow(4,7) // the function call
watch.Stop()
결과는 (~ 내 컴퓨터에이 300ms) 아주 좋은하지 않았다 (10 번이나 실행 한 검사 및 평균 값을 calcuated)처럼 내 벤치 마크 프로그램 보인다.
첫 번째 아이디어는 정적 함수이기 때문에 이것이 무엇인지 확인하는 것이 었습니다. 그래서를 통해 직접 내 자신의 클래스
class MyMath
{
public static double Pow (double x, double y) //Using some expensive functions to calculate the power
{
return Math.Exp(Math.Log(x) * y);
}
public static double PowLoop (double x, int y) // Using Loop
{
double res = x;
for(int i = 1; i < y; i++)
res *= x;
return res;
}
public static double Pow7 (double x) // Using inline calls
{
return x * x * x * x * x * x * x;
}
}
나는 Math.Pow (4,7)를 대체 할 경우 내가 확인 세 번째 일이었다 구현 4 * 4 * 4 * 4 * 4 * 4 * 4. 탕 위해 수학을 사용하지 마십시오
결과는
300 ms Math.Pow(4,7)
356 ms MyMath.Pow(4,7) //gives wrong rounded results
264 ms MyMath.PowLoop(4,7)
92 ms MyMath.Pow7(4)
16 ms 4*4*4*4*4*4*4
지금 내 상황은 지금과 같이 기본적으로 (10 테스트 중 평균 실행)이다. 내 유일한 문제는 바로 ... 지금 내 수학 수업을 실제로 구현해야합니까? 그것은 어떻게 든 힘 기능을 위해서만 자신의 클래스를 구현하는 것은 비효율적 인 것 같습니다. (Btw. PowLoop 및 Pow7은 Release 빌드에서 Math.Pow가 아닌 동안 ~ 25 % 더 빠릅니다).
그래서 내 마지막 질문
이가) 나는 모든 (하지만 내가 어떻게 든 슬픈 어쩌면 분수) (용)에서 Math.Pow를 사용하지 않는다면 내가 잘못.
b) 최적화 할 코드가 있다면 직접 모든 수학 연산을 직접 작성 하시겠습니까?
는C) 수학 연산
D) 내 질문의 소스에 대한 빠른 (오픈 소스 ^^) 라이브러리 어쩌면 이미 거기는 기본적으로 : I는 .NET Framework 자체가 이미 매우 최적화 된 제공한다고 가정 한 Math-Class 나 배열을 처리하는 것과 같은 기본적인 작업을위한 코드/컴파일 결과를 얻었고 나 자신의 코드를 작성하여 얼마나 많은 이익을 얻을지 조금 놀랐습니다. C#에서 직접 볼 수있는 다른 "일반적인"필드 또는 다른 것이 C#을 직접 신뢰할 수 없습니다.
나는 4 * 4 * 4 * 4 * 4 * 4가 컴파일 시간에 평가 될 것이라고 생각한다. 따라서 그것은 매우 빠르다. – Nick
대부분의 사람들은 100ms 정도는 큰 문제가 아니라고 생각합니다. C#은 대부분의 사람들이 사용하는 응용 프로그램의 첫 번째 선택이 아닙니다. – Ian
큰 숫자로 테스트 했습니까? 나는 Math.Pow가 더 큰 지수에 최적화되어 있다고 생각할 것입니다. x^7 == x^{3 + 3 + 1} == {x^3 + x^3 x}, 이것은 실행 중일 것입니다. 순서는 거칠다 O (log (n)), 솔루션은 O (n)이고, 큰 지수의 경우 훨씬 느릴 것이다. – markijbema