2016-07-14 64 views
1

我建立了一個類矢量前段時間我很常用。隨着時間的推移,我添加了越來越多的有趣且有用的方法,如標準化,投影等等。班級開始變得相當大,並且可能會變得更大。大班是否會影響表現?

由於我使用這個類來計算1000多個對象的位置和運動,並且每1/60秒創建一個新實例,我開始擔心性能和/或內存可能會成爲問題。

我試過在Google上尋找答案,但只找到了指向C++的this,但也許答案仍然適用?

否則我的問題是:是否有任何重大的性能問題?我應該嘗試讓我的班級變小一點,並創建功能嗎?使用我應該注意的大類還有其他重大缺點嗎?

+0

您應該考慮使用和簡單性,而不是性能。這些額外的方法是否總是被使用或者是專門的?如果某些額外的好東西在派生類中,您的設計會更好嗎?無論如何,他們是否與班級相關(考慮應用於代碼的規範化)?他們會更適合在另一個班級(混合),所以有趣的東西可以重用?保持它(你的課)簡單。 – cdarke

+0

我的確在第一手考慮使用和簡單性,但我仍然對性能影響感到好奇。我喜歡課堂設計的方式,每種方法都與課堂相關。但是其中很多都是專門的,所以如果將這些方法轉換成功能並不是什麼大問題,那麼它將會使性能提高很多。 –

+0

好的,內存中字節碼的佈局將非常具體實現和版本。但是請考慮整個模塊在導入時被編譯和加載。包含專門方法的另一個模塊中的派生類不需要導入(因此編譯和加載),因此只會在需要時提供開銷。代碼可以被構建成包(目錄樹)。您需要使用自己的代碼進行基準測試,以查看是否存在顯着的性能差異。這將取決於數量。 – cdarke

回答

2

類的(代碼)大小沒有(直接)性能結果。另外,只要你沒有或期待性能問題,不要專注於優化(主要是優化導致更多的工作,有時更多的不可讀/可維護的代碼)。只有在需要時才進行性能優化。最初,始終專注於小班/可讀性/可維護性。尤其是最後一個看起來很重要,因爲你定期添加功能

您已經提供了一些功能區域,如投影,標準化。也許你可以將它們移動到其他類或輔助類,如果他們不需要任何數據。如果有一些特定的矢量類型,或者你可以使用策略模式來執行不同類型的算法,也許你可以使用繼承拆分你的類。但是,也許你只有數百個可以在矢量上使用的函數;在這種情況下,使用助手方法,傳遞矢量並將每個方法放在最好的助手類中。

像例如正常化:

public abstract VectorNormalization 
{ 
    public void Normalize(Vector v) 
    { 
     .. do something with v 
    } 

    public void NormalizeDifferent(Vector v) 
    ... 
} 

,您可以通過

Vector v = Vector(3,4); 
VectorNormalization.Normalize(v); 

關於績效調用它。調用Normalize函數:

  • 通常,輔助類在內部使用所謂的v表。要調用一個輔助方法,編譯器需要將v-table start添加到函數中並調用它,這是一個非常可忽略的性能損失。我認爲C++和Python的工作非常相似。
  • 此外,堆棧需要填充矢量。
  • 函數調用已完成。

只有第一個會改變,因爲在一個大的班級中,第二和第三個也是需要的。

您可以通過在需要的地方優化算法本身來贏得更高的性能。

btw,

+0

我已經閱讀了幾次你的答案,我不確定它是否回答我的問題。不要誤解我的意思,我感謝你給我舉例說明如何組織我的代碼來保持可讀性/可維護性,這一直是我的優先事項,但我更關心性能影響和pythonic方式。仍然+1有價值的信息 –

+0

我增加了一些關於性能的東西。 –