2011-06-06 23 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