Math.sin()
,Math.cos()
等功能有多廣泛? 如果您連續多次調用具有相同參數的方法,編譯器是否會優化代碼?如果沒有,那麼你應該在多少次這些方法的調用中開始將結果緩存到一個變量中?應該緩存三角函數嗎?
3
A
回答
1
三角函數通常實現爲泰勒展開式。他們很快。你可以編寫你自己的並進行比較。
public class Main{
private static double factorial(double n) {
if (n <= 1) // base case
return 1;
else
return n * factorial(n - 1);
}
private static double sin(int n) {
int PRECISION = 10;
double rad = n*1./180.*Math.PI;
double sum = rad;
for (int i = 1; i <= PRECISION; i++) {
if (i % 2 == 0)
sum += Math.pow(rad, 2*i+1)/factorial(2 * i + 1);
else
sum -= Math.pow(rad, 2*i+1)/factorial(2 * i + 1);
}
return sum;
}
public static void main(String []args){
System.out.println(sin(180));
System.out.println(Math.sin(Math.PI));
System.out.println(sin(90));
System.out.println(Math.sin(Math.PI/2));
System.out.println(sin(200));
System.out.println(Math.sin(200*2*Math.PI/360));
}
}
當然,您可以緩存這些值,但這些方法可能已經過優化。
1
與所有性能問題一樣,您應該編寫一個基準並自行查找,因爲答案取決於您的JVM,操作系統和硬件。可以肯定的說Math.sin/cos在現代PC和服務器硬件上需要幾百納秒 - 不僅僅是從主內存中加載一些內容 - 所以最大化性能的最佳方法是儘可能緩存。但在進行更改之前和之後總是進行測量。
相關問題
- 1. 在Python中它存在函數從三角函數值返回角度嗎?
- 2. 三角函數
- 3. 我應該禁用WebClient緩存嗎?
- 4. 應該緩存getSystemService(...)結果嗎?
- 5. 我應該緩存System.getProperty(「line.separator」)嗎?
- 6. 我應該緩存載波網址嗎?
- 7. Angular:應該緩存靜態內容嗎?
- 8. 我應該緩存Firebase參考嗎?
- 9. 三角三角函數(ActionScript 3)
- 10. SPARQL三角函數
- 11. CloudFlare不應該與「緩存一切」緩存所有內容嗎?
- 12. 函數應該調用嗎?
- 13. 函數應該有效嗎?
- 14. 我應該緩存數據庫數據嗎?
- 15. 該符號的直角三角形,邊數等於該數字
- 16. 逼近反三角函數
- 17. 3d三角函數方程
- 18. Objective-C三角函數
- 19. 的Python:用三角函數
- 20. 緩存mustache.js模板函數可能嗎?
- 21. 緩存本地函數聲明嗎?
- 22. 函數不應該是參數嗎?
- 23. 我應該擔心高速緩存的內存嗎?
- 24. `constexpr`函數也應該是`noexcept`嗎?
- 25. 我應該在瀏覽器內存中緩存多少數據有限制嗎?
- 26. 響應三角?
- 27. Python函數緩存?
- 28. 緩存服務是否應該存在?
- 29. 數學,簡化三角函數
- 30. Mathematica中三角函數和的係數
你應該讓JIT擔心這一點。 – Kayaman