2015-01-15 5 views
0

저는 기본적으로 많은 계산을 꽤 빨리 수행해야하는 Java 프로그램을 만들고 있습니다 (각 프레임, 적어도 30f/s를 목표로 함). 이들은 대부분 삼각 함수와 힘 함수입니다. 내가 묻는 질문은 다음과 같습니다. 더 빠릅니다. 이미 제공 한 Java 수학 함수를 사용하고 있습니까? 또는 내 자신의 함수를 작성하여 실행할 수 있습니까?사용자 정의 수학 함수 대 제공된 수학 함수?

+0

객관적인 대답은 그것이 당신이 할 수있는 일이 얼마나 좋은가에 달려 있다는 것입니다. –

+0

일반적인 수학 규칙 라이브러리는 언어에 대한 수학 함수 라이브러리가 제공하는 라이브러리보다 빠르기 때문에 항상 사용할 수없는 방식으로 최적화 옵션을 제공하므로 (작성하지 않는 한) 어셈블러에있는 것들). –

+0

'java.lang.Math'에 필요한 함수가 없더라도 다른 사람이 같은 문제를 해결하고 [그것을 해결하는 라이브러리]를 작성했음을 확신합니다 (http://stackoverflow.com/questions/ 7258538/free-java-library-for-evaluating-math-expressions)을 참조하십시오. 사실, [여기에 발명되지 않은] (http://en.wikipedia.org/wiki/Not_invented_here) (NIH 증후군)은 소프트웨어 개발에서 일반적으로 알려진 반 패턴이며 [바퀴의 재발견] (http : // en .wikipedia.org/wiki/Reinventing_the_wheel). – gknicker

답변

8

내장 된 Math 함수는 하드웨어 내장 함수를 사용하는 특수한 JVM 마법이 있기 때문에 매우 어렵습니다. 당신은 생각할 수는 많은 작품의과 정확성을 멀리 거래에 의해 그들 중 일부를 이길 수 있지만, 그렇지 않으면 Math 유틸리티를 이길 매우 확률이 낮다.

+2

일반적인 평가에 동의하지만 사용자 정의 함수 구현을 작성하는 것은 프로그래머의 기술과 기능에 대한 제한 사항에 따라 많은 작업을 필요로하지 않을 수도 있습니다. 낮은 정확도는 단지 하나의 가능한 절충 일 뿐이며 다른 인수는 제한된 인수 범위를 지원합니다 (특히 삼각 함수의 경우 유용함). 특별한 경우를 다루지 않아도됩니다. [많이 사용하는'pow()'에 매우 유용합니다. 특별한 경우]. – njuffa

1

java.lang.Math 함수를 사용하려는 경우 대부분은 native으로 JVM에서 실행됩니다. 소스 코드 here을 볼 수 있습니다.

+0

네이티브가 아닌 메소드도 본질적 일 수 있습니다. 즉, Java 코드가 실행되지 않고보다 효율적인 코드로 런타임에 JVM에 의해 대체됩니다. – assylias

1

많은 지능 있고 유능한 사람들이 수년 동안 수학 기능을 가능한 한 신속하고 정확하게 작동하도록 많은 노력을 기울였습니다. 따라서 당신이 모든 사람들보다 더 똑똑하지 않고 이것에 쓸 수있는 수년 간의 자유 시간을 가지면, 당신이 더 나은 일을 할 수 없을 것입니다.

대부분이 네이티브입니다. 실제로 자바가 아닙니다. 따라서 자바에서 더 빠른 버전을 작성하는 것은 완전한 중단 일 것입니다. 자신의 글을 쓸 때 C와 어셈블리 언어를 혼합하여 사용하는 것이 가장 좋습니다. 그리고 당신은 이것을 실행할 하드웨어의 모든 단점을 알아야 할 것입니다.

또한 현재 전 세계 수백만 명의 사람들이 Java를 어떤 방식 으로든 사용하고 있기 때문에 여러 해 동안 테스트를 거쳤습니다. 동일한 테스터 본문에 액세스하지 않으므로 표준 함수보다 오류가 발생하기 쉽습니다. 이것은 피할 수없는 일입니다.

그렇다면 자신의 기능을 계속 작성 하시겠습니까?

0

옵션은 값을 캐싱하는 것입니다. 고정 값 집합 만 필요하거나 완벽한 정확도없이 빠져 나올 수 있다는 것을 알고 있다면 많은 시간을 절약 할 수 있습니다. 당신이 많은 동그라미를 그리기를 원한다면 각 학위에 대해 sin과 cos의 값을 미리 계산하십시오. 그런 다음 그릴 때이 값을 사용하십시오. 대부분의 서클은 충분히 작아서 차이를 볼 수 없으며 매우 작은 수는 라이브러리를 사용하여 수행 할 수 있습니다.

테스트 해 볼 가치가 있는지 확인하십시오. 내 5 년 된 맥북에서 나는 초당 백만 번 평가를 할 수있다.

1

1e-15ish 상대 오류 (또는 pow (double, double)에 대해 1e-13ish와 비슷 함)를 수행 할 수 있다면 시도해 볼 수 있습니다. 많이 부르면 java.lang.Math보다 빠릅니다. : http://sourceforge.net/projects/jafama/

비슷한 말로 (1-ulp-ish) 정확도를 유지하려면 보통 순수 Java에서 java.lang.Math를이긴 것이 어렵지만 이중 정밀도에서는 정확도가 약간 떨어지는 경우가 많습니다 견디기 쉽고 (여전히 플로트로 계산할 때보다 정확함), 눈에 띄는 속도 향상을 가능하게합니다.