2010-06-01 82 views
3

我想計算兩個向量之間的角度,但我看到這些反向trig操作,如acos和atan使用大量的cpu週期。有沒有一種方法可以在不使用這些功能的情況下完成計算?另外,當你進行優化時,它們是否真的會打到你?是否acos,stl中的atan函數使用很多cpu週期

+0

您是否確定*您需要原始角度?是的,根據我的經驗,trig函數極其緩慢,即使在現代cpus和高優化設置下也是如此。發佈您正在嘗試解決的問題,我們可以告訴您是否可以使用點/跨產品。 – user168715 2010-06-02 20:33:36

回答

10

STL中沒有這樣的功能;那些在數學圖書館。

另外,你確定這裏很有效率嗎?你有沒有在熱點地區查看是否有這樣的函數調用?你知道使用這些功能時性能不好嗎?在進行這種微型優化之前,您應該始終回答這些問題。

爲了給出建議,你打算怎麼處理它?它有多準確?

如果您需要高精度的實際角度,您可能無法做得更好。如果您需要進行一些比較,則可以使用絕對值和點積來獲得角度的餘弦。如果你不需要精確的話,你可以做到這一點,並使用一個acos查詢表。如果您將它用作另一個計算的輸入,您可能可以使用一些幾何圖形或三角形標識來避免找到反餘弦或反正切。

在任何情況下,一旦您完成了要做的優化工作,請在計時運行前後進行測試,看看您是否做出了重大改變。

+0

+1用於更正數學庫的來源,並提及關於分析和精確度。 – 2010-06-02 03:10:06

+0

++對,我喜歡關於使用點積的觀點,儘管我想你需要角度的正弦來進行比較。 – 2010-06-02 12:04:49

2

這完全是實現定義的。當然,您可以使用第三方實現或近似方法,但首先應該確定瓶頸是什麼。

2

如果這些函數確實是瓶頸,而且只需要一個近似值,那麼可以嘗試使用這些函數的擴展的幾個第一項。下一個未使用的項的大小代表近似值中的誤差。

Arccos Taylor series

Arctan Taylor series

+0

其他人在這裏被Wolfram Alpha吹走了?你可以問任何事情!試試「空載歐洲燕子的空速是多少?」。 – 2010-06-01 22:34:45

1

的ATAN和ACOS實現依賴於編譯器和優化設置。許多實現將使用表格並插值以獲得最接近的值。

首先嚐試以下步驟:

  1. 剖析應用找到 大部分的執行時間是花在 。
  2. 重新設計此區域以獲得更好的效果 表現。
  3. 考慮Data Driven Design 加速您的程序的技巧。
  4. 更改邏輯以減少分支和 if語句,考慮使用 Karnaugh maps來簡化 邏輯。