2010-07-22 56 views
2

我有一個叫做「模擬」的類和一個求解模擬的方法。非常大的類的性能

class sim 
{ 
    void Step() 
    { 
    } 

    other methods (20+)... 
} 

Sim類只在程序中實例化一次。

在程序中,以百萬的順序調用步驟方法。

Step方法使用了很多局部變量(100+)。其他方法都沒有使用這些當地人。

是更好地使這些局部變量的類成員或讓他們爲當地的步驟()獲得更好的性能?

+6

我不確定性能,但我會擔心任何有100多個局部變量的方法。對我來說,這個提示非常強烈,表明該方法很可能太大而不易理解。 – 2010-07-22 10:21:11

+1

這看起來像不成熟的優化。做一些時間安排,看看節目是否花費更多時間在「步驟」上,而不是需要。 – ChrisF 2010-07-22 10:21:52

回答

2

作爲一般規則,您應該最小化變量的範圍,並且只有在證明絕對必要時才增加範圍。將局部變換爲成員變量是一個糟糕的設計選擇,因此需要非常有力的理由。

另請注意,如果局部變量具有不平凡的構造函數,則只有成本。具有noop構造函數或根本沒有構造函數的局部變量沒有設置成本,因此擴展其範圍將毫無意義。

+0

我使用雙打,但仍然創建它們,每次調用func都花費很多。 在我的測試中,將本地變量轉換爲成員變量會提高性能。 但是這段代碼非常難看,目前狀態下很難閱讀:( – Kayhano 2010-07-22 10:51:30

+0

@Kayhano:你能解釋一下如何創建堆棧變量「花費很多嗎?」 – Hut8 2010-08-06 21:20:02

+0

@Kayhano:你對於如何使用在你對@Pontus Gagge的評論中注意到你在多次調用中存儲和重用計算值,這不是一個堆棧vs成員問題,而是一個緩存問題。當然,如果預先計算某些值並將它們緩存到調用中(這自然需要使用非局部變量),那麼速度會更快,但這與「創建」堆棧變量的成本無關,這對於雙精度來說爲零。 – 2010-08-06 22:51:59

4

depends。什麼類型的變量:原始類型或對象?如果是後者,你的IL代碼仍然會追逐他們的指針。如果是前者,它取決於你訪問它們的順序以及你的目標CPU。優化變量佈局應該在性能調優活動列表的下方,特別是在C#中,當您依賴於IL被轉換爲什麼組合時。

像往常一樣優化:首先措施表現識別瓶頸。然後考慮你可以做些什麼來消除它們。在你知道你需要做這樣的事情之前,儘可能清楚地寫下你的代碼:不要通過將它們提升到類級別來不必要地暴露局部變量。並考慮分裂該方法:一個很大的方法很難理解,因此更難以優化。

+0

所有的局部變量都是雙打的。 – Kayhano 2010-07-22 10:48:54

+0

我使用本地變量來提高速度。他們中的大多數都存儲了多次使用的方程式值。例如, , //計算x軸距離。 double dx = xp [i] - xp [j]; 然後我在幾個地方使用dx。 – Kayhano 2010-07-22 11:24:32

0

如果一些變量包含了可以在多個方法調用之間被重用的對象,你會跳過處置舊實例和創建與每個方法調用一個新的實例的開銷。例如,在方法調用之間不會改變的依賴注入容器中的查找可以在字段中「緩存」。

但是,除此之外,你可能不會獲得很大的性能提升。你可以嘗試一下,使用一個分析器來衡量你的代碼性能。分析器還可以幫助您識別代碼中的其他瓶頸。