저는 기본적으로 많은 계산을 꽤 빨리 수행해야하는 Java 프로그램을 만들고 있습니다 (각 프레임, 적어도 30f/s를 목표로 함). 이들은 대부분 삼각 함수와 힘 함수입니다. 내가 묻는 질문은 다음과 같습니다. 더 빠릅니다. 이미 제공 한 Java 수학 함수를 사용하고 있습니까? 또는 내 자신의 함수를 작성하여 실행할 수 있습니까?사용자 정의 수학 함수 대 제공된 수학 함수?
답변
내장 된 Math
함수는 하드웨어 내장 함수를 사용하는 특수한 JVM 마법이 있기 때문에 매우 어렵습니다. 당신은 생각할 수는 많은 작품의과 정확성을 멀리 거래에 의해 그들 중 일부를 이길 수 있지만, 그렇지 않으면 Math
유틸리티를 이길 매우 확률이 낮다.
일반적인 평가에 동의하지만 사용자 정의 함수 구현을 작성하는 것은 프로그래머의 기술과 기능에 대한 제한 사항에 따라 많은 작업을 필요로하지 않을 수도 있습니다. 낮은 정확도는 단지 하나의 가능한 절충 일 뿐이며 다른 인수는 제한된 인수 범위를 지원합니다 (특히 삼각 함수의 경우 유용함). 특별한 경우를 다루지 않아도됩니다. [많이 사용하는'pow()'에 매우 유용합니다. 특별한 경우]. – njuffa
많은 지능 있고 유능한 사람들이 수년 동안 수학 기능을 가능한 한 신속하고 정확하게 작동하도록 많은 노력을 기울였습니다. 따라서 당신이 모든 사람들보다 더 똑똑하지 않고 이것에 쓸 수있는 수년 간의 자유 시간을 가지면, 당신이 더 나은 일을 할 수 없을 것입니다.
대부분이 네이티브입니다. 실제로 자바가 아닙니다. 따라서 자바에서 더 빠른 버전을 작성하는 것은 완전한 중단 일 것입니다. 자신의 글을 쓸 때 C와 어셈블리 언어를 혼합하여 사용하는 것이 가장 좋습니다. 그리고 당신은 이것을 실행할 하드웨어의 모든 단점을 알아야 할 것입니다.
또한 현재 전 세계 수백만 명의 사람들이 Java를 어떤 방식 으로든 사용하고 있기 때문에 여러 해 동안 테스트를 거쳤습니다. 동일한 테스터 본문에 액세스하지 않으므로 표준 함수보다 오류가 발생하기 쉽습니다. 이것은 피할 수없는 일입니다.
그렇다면 자신의 기능을 계속 작성 하시겠습니까?
옵션은 값을 캐싱하는 것입니다. 고정 값 집합 만 필요하거나 완벽한 정확도없이 빠져 나올 수 있다는 것을 알고 있다면 많은 시간을 절약 할 수 있습니다. 당신이 많은 동그라미를 그리기를 원한다면 각 학위에 대해 sin과 cos의 값을 미리 계산하십시오. 그런 다음 그릴 때이 값을 사용하십시오. 대부분의 서클은 충분히 작아서 차이를 볼 수 없으며 매우 작은 수는 라이브러리를 사용하여 수행 할 수 있습니다.
테스트 해 볼 가치가 있는지 확인하십시오. 내 5 년 된 맥북에서 나는 초당 백만 번 평가를 할 수있다.
1e-15ish 상대 오류 (또는 pow (double, double)에 대해 1e-13ish와 비슷 함)를 수행 할 수 있다면 시도해 볼 수 있습니다. 많이 부르면 java.lang.Math보다 빠릅니다. : http://sourceforge.net/projects/jafama/
비슷한 말로 (1-ulp-ish) 정확도를 유지하려면 보통 순수 Java에서 java.lang.Math를이긴 것이 어렵지만 이중 정밀도에서는 정확도가 약간 떨어지는 경우가 많습니다 견디기 쉽고 (여전히 플로트로 계산할 때보다 정확함), 눈에 띄는 속도 향상을 가능하게합니다.
객관적인 대답은 그것이 당신이 할 수있는 일이 얼마나 좋은가에 달려 있다는 것입니다. –
일반적인 수학 규칙 라이브러리는 언어에 대한 수학 함수 라이브러리가 제공하는 라이브러리보다 빠르기 때문에 항상 사용할 수없는 방식으로 최적화 옵션을 제공하므로 (작성하지 않는 한) 어셈블러에있는 것들). –
'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