類的(代碼)大小沒有(直接)性能結果。另外,只要你沒有或期待性能問題,不要專注於優化(主要是優化導致更多的工作,有時更多的不可讀/可維護的代碼)。只有在需要時才進行性能優化。最初,始終專注於小班/可讀性/可維護性。尤其是最後一個看起來很重要,因爲你定期添加功能
您已經提供了一些功能區域,如投影,標準化。也許你可以將它們移動到其他類或輔助類,如果他們不需要任何數據。如果有一些特定的矢量類型,或者你可以使用策略模式來執行不同類型的算法,也許你可以使用繼承拆分你的類。但是,也許你只有數百個可以在矢量上使用的函數;在這種情況下,使用助手方法,傳遞矢量並將每個方法放在最好的助手類中。
像例如正常化:
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,
您應該考慮使用和簡單性,而不是性能。這些額外的方法是否總是被使用或者是專門的?如果某些額外的好東西在派生類中,您的設計會更好嗎?無論如何,他們是否與班級相關(考慮應用於代碼的規範化)?他們會更適合在另一個班級(混合),所以有趣的東西可以重用?保持它(你的課)簡單。 – cdarke
我的確在第一手考慮使用和簡單性,但我仍然對性能影響感到好奇。我喜歡課堂設計的方式,每種方法都與課堂相關。但是其中很多都是專門的,所以如果將這些方法轉換成功能並不是什麼大問題,那麼它將會使性能提高很多。 –
好的,內存中字節碼的佈局將非常具體實現和版本。但是請考慮整個模塊在導入時被編譯和加載。包含專門方法的另一個模塊中的派生類不需要導入(因此編譯和加載),因此只會在需要時提供開銷。代碼可以被構建成包(目錄樹)。您需要使用自己的代碼進行基準測試,以查看是否存在顯着的性能差異。這將取決於數量。 – cdarke