2011-02-01 49 views
2

我正在編寫一個遊戲,在渲染代碼中進行速度計算非常重要。運算速度

如何獲得某些操作的速度?

例如,如何知道乘法是否比sqrt等更快?或者我必須進行測試並計算時間。

編程語言是C++,謝謝。

+0

找到處理器參考並查看延遲/吞吐量:例如http://download.intel.com/design/processor/manuals/248966.pdf – Anycorn 2011-02-01 19:03:19

回答

5

這種微型優化只是浪費你的時間以獲得最小收益。

使用一個分析器,並開始通過改進自己的算法和代碼,無論探查器告訴你遊戲花費大部分時間。

請注意,在某些情況下,爲了實現更高效的設計,您可能必須檢修整個軟件或其中的大部分軟件。在這種情況下,剖析器的結果可能會誤導缺乏經驗的人。例如。與一勞永逸地緩存其結果相比,優化複雜計算可能獲得最小的收益。請參閱this somewhat related thread

0

最好的辦法是使用像AQTime這樣的工具並進行性能分析。然後你會知道在哪裏花時間優化。但是過早地做或者基於猜測工作可能不會讓你感覺太多,並且使代碼複雜化或者破壞某些東西。如果可以的話,最好的辦法是進行任何浮點計算,特別是sin,cos等,以及sqrt。

我曾經有過這樣的事情:

for i = 0 to nc 
    for j = 0 to nc 
     aij = sqrt(a[i]*b[j]) 

,其計算NC數控*平方根。但是由於sqrt(a * b)等於sqrt(a)* sqrt(b),所以您可以事先預先計算所有a和b的平方根,以便循環變成如下所示。所以不是nc * nc平方根,而是2 * nc平方根。

for i = 0 to nc 
    for j = 0 to nc 
     aij = asqrt[i]*bsqrt[j] 
0

您問的問題高度依賴於您在硬件級開發的平臺。不僅在不同的芯片組之間會有差異(英特爾/ AMD),而且平臺上也會有不同的變化(我懷疑iPhone沒有儘可能多的指令去做某些事情)。

您在您的問題中聲明您正在討論「呈現代碼」。如果您正在討論實際在GPU(着色器代碼)上運行的代碼而不是CPU,則規則會發生大規模變化。

由於@thkala說,我真的不會在你開始之前擔心這一點。我發現它不僅更容易,而且可以更快地以首先使用的方式進行編碼,然後(只有在需要改進時)重新編寫代碼分析時緩慢的位。更好的算法通常會提供比嘗試僅使用特定功能更好的性能。

在我們正在爲iPhone開發的遊戲中,我唯一想到的就是大數學運算(sqrt)很慢(不是基本的數學運算),而且運行的循環每一幀都會很快吃光CPU。牢記這一點,我們不需要優化任何代碼 - 因爲它無論如何都以60fps運行 - 所以我很高興我一開始並不擔心它。

1

確定特定操作的速度通常稱爲分析。對操作進行分析的最佳解決方案是使用分析器。 Visual Studio有一個很好的分析器。 Linux有gprof。如果你的編譯器沒有分析器,那麼購買一個編譯器可能是值得的,如果你經常分析你的代碼的話。

如果不使用專業的探查度日,那麼你通常可以通過嵌入自己到你的程序

check this out一些分析器的代碼獲得。