2014-03-03 107 views
0

我似乎我的頭撞到下面反射性能涉及

我明白,當在在LIB基礎上運行,不小心扔到風的反射可能是昂貴的。 How costly is .NET reflection?

但是說我有following,我打算在我的web API端點上使用它。像這樣:

public AnotherDto Get(int someId) 
    { 
     var item = this.repo.FindAll(o => o.Id == someId) 
          .Take(1).Map<SomeDto>() 
          .FirstOrDefault(); 

     var result = this.otherRepo 
         .FindAll(o => o.Id == item.Id) 
         .Map<AnotherDto>();  

     return result; 
    } 

凡地圖<>()

public static IEnumerable<U> Map<U>(this IEnumerable<object> e) 
    { 
     var method = typeof(EntityExtensions).GetMethods(BindingFlags.Static | BindingFlags.Public)  
     .Where(m => m.Name == "Map" && m.GetGenericArguments().Length == 2) 
     .Single(); 
     method = method.MakeGenericMethod(e.GetType().GetGenericArguments()[0], typeof(U)); 

     return method.Invoke(null, new object[] { e}) as IEnumerable<U>; 
    } 

這是東西,將被視爲代碼,將敲背性能到這樣的程度,以保證不使用它?

+5

你爲什麼不[測量](http://msdn.microsoft.com/cs-cz/library/system.diagnostics.stopwatch(v = vs.110).aspx)? – twoflower

+3

這一切都取決於它被調用的頻率。對於這樣的事情,我通常傾向於像[AutoMapper](https://github.com/AutoMapper/AutoMapper)或[ValueInjecter](http://valueinjecter.codeplex.com/)之類的東西,或者如果你真的在追趕速度[EmitMapper](http://emitmapper.codeplex.com/)。 – James

+0

好的建議。我一定會嘗試一下。這會被認爲是對此進行基準測試的有效方法嗎? –

回答

1

首先,這可能不是您的應用程序的瓶頸。例如,您使用存儲庫模式表明您正在與數據庫交談。這將比這裏發佈的代碼慢得多。分析您的應用程序,看看什麼是緩慢的,因此值得花時間優化。爲了解決您的代碼問題,您應該注意的唯一潛在問題是,當您返回一個IEnumerable時,可能會多次評估它,這會導致代碼被多次運行。爲了減輕增加的複雜性,您應該緩存結果,以便只調用一次。

0

緩存該方法,然後在Map中調用它。然後,反射性能命中將只有一次。