2009-09-27 20 views
1

有關於如何更好地優化或加快速度的問題。目前,我的代碼似乎運行有點慢......C#.net修飾器模式轉換/設置集合

我有以下類

public class DataFoo : IFoo { } 

public class Foo 
{ 
    internal IFoo UnderlyingDataObject{get;set;} 

    public Foo(IFoo f) 
    { 
      UnderlyingDataObject = f; 
    } 
} 

現在,在很多情況下,我最終需要或調用的方法,將提供回列表。這種方法首先將得到DataFoo對象的數組,將遍歷所有返回的對象實例傳入DataFoo一個新的Foo對象......下面是一個例子...

public List<Foo> GetListOfFoo(Guid id) 
{ 
    DataFoo[] q = GetArrayOfDataFoo(id); 
    List<Foo> rv = new List<Foo>(); 

    for(var i = 0; i < q.Length; i++) 
    { 
      rv.Add(new Foo(q[i])); 
    } 
    return rv; 
} 

的問題是,必須遍歷並像這樣實例化看起來很慢。我很好奇,如果有人可能會有如何加快這一點的建議...

+2

你有配置文件的代碼,以驗證a)它運行速度慢b)這段代碼是瓶頸? – ChrisF

+0

我正在將代碼從現有的linq轉換爲sql實現,使用nhibernate/fluent nhibernate這種方法... 從我看到的比較兩個版本;新代碼較慢。由於引入了nhibernate或者因爲發生的所有for循環,所以它的運行速度較慢... – Jason

+1

使用Profiler來檢查性能瓶頸 - 而不是猜測;它們很少出現在你期望的地方。我希望ORM提供者的變化比循環性能更重要。 –

回答

3

首先,你應該仔細分析這一點。無論何時你看性能,都不要試圖猜測發生了什麼 - 衡量一切。通常你會對事實感到驚訝。

你的GetListOfFoo定義可以稍微改善通過指定初始容量,以避免List<Foo>不必要的調整大小:

DataFoo[] q = GetArrayOfDataFoo(id); 
List<Foo> rv = new List<Foo>(q.Length); 

但是,除非你正在處理非常大的陣列和非常小的週期有關自己的時間,那麼這不會有太大的區別。

沒有關於您使用的修飾器模式,應該會顯着影響您的性能,除非您每秒鐘或微秒的延遲談論數百萬次更新。

我想看看GetArrayOfDataFoo在做什麼。我的猜測是你的問題發生在你向我們展示的東西之外。

+0

乾杯;我錯過了轉換; -p –

+0

GetArrayOfDataFoo使用流暢的nhibernate/nhibernate和linq來nhibernate來簡單地對數據庫進行linq調用並取回一個對象數組... – Jason

+0

然後我會專注於你的能量代碼,而不是裝飾者模式或轉換。這只是冰山一角。使用分析器來了解發生了什麼。我相信Ayende Rahien有一個NHibernate profiler,但我自己並沒有使用它。 –