2011-06-06 42 views
1

我有一個poco需要在高流量系統中映射到另一個poco。我打算用一個簡單的映射器將這些對象映射到一起:在高負載系統中映射POCO的成本C#

public class a 
{ 
    public int MyValue { get;set; } 
    public string YAV { get; set; } 
} 

public class B 
{ 
    public int aTestValue { get;set; } 
    public string YetAnotherValue { get; set; } 
} 

public class Mapper 
{ 
    public static B MapIt(A a) 
    { 
     return new B { aTestValue = a.MyValue, YetAnotherValue = a.YAV }; 
    } 
} 

這樣的映射究竟會影響性能多少?忽略這樣一個事實,即我們必須爲我們所有類型編寫一個映射,並只關注在實際映射中丟失的性能。

+1

你在哪裏/何時映射這些?這些是在一個循環?等等。 – user7116 2011-06-06 17:36:26

回答

3

根據我們的經驗,開銷也不會太大。我最近通過使用Linq to SQL檢索75,000行數據,然後使用我們編寫的映射代碼將L2S實體映射到POCO實體來測試了這一點。這樣做的成本是驚人的小。如果我記得正確的話,它可以像75到100個女士那樣映射75K行。

7

這樣的映射究竟會影響性能多少?

我會說,即使在高流量系統中,這樣的映射也不會影響性能。調用getter和setter的成本與其他可能的操作相比可能微不足道。

很明顯,這只是2美分,如果你想真正的東西做性能基準和測量有和沒有映射的差異。

至少這就是我要做的:做出符合要求的東西,然後進行基準測試,然後有兩種可能性:您對結果滿意=>在生產中出貨並享受生活,或者您不滿意結果和這些基準允許您確定這部分是您的應用程序的瓶頸=>重構代碼並開始考慮優化它。但絕對不要過早優化,否則你很難尊重項目的最後期限。

+1

「不成熟的優化是萬惡之源。」 - Knuth – 2011-06-06 17:58:02

1

這幾乎是不可能知道這將如何影響性能,無需瞭解該系統的規模的東西,在循環結構中,這種映射發生等

一般來說,這些類型的簡單映射的是快,但是當涉及到序列化等事情時,您總是會遇到與我提到的擴展問題相關的問題。

1

要做的最好的事情就是掛接到分析器並進行一些測量。做這樣的手動映射是一個相當輕的方式來做到這一點,所以不應該是重要的。該AutoMapper工具也可用,並且將降低編碼時間,但已經因爲它的其他服務除了剛剛映射多一點的開銷: Analyzing AutoMapper Performance

0

如何使用conversion operators。如果剖析器顯示它是一個瓶頸,那麼只擔心它的性能。

+0

[Conversion Operators Are Bad](http://netvignettes.wordpress.com/2011/04/24/implicit-conversion-operators-are-bad/)@Andrei – 2011-06-06 19:50:26

+0

@snafu:不,隱式轉換是「不好的」 「不明確的 – Andrei 2011-06-06 20:46:05

+0

很高興知道@Andrei我會研究明確的路徑。 – 2011-06-08 13:20:38