2009-07-02 197 views
10

我有一個事件處理程序需要確定一個類型並執行代碼,如果它匹配一個特定的類型。最初我們把它轉換成一個對象,如果它不是null,我們執行代碼,爲了加快速度,我使用了反射,實際上它減慢了速度,我不明白爲什麼。爲什麼在.NET中投射速度比反射速度快?

這裏是一個代碼示例

Trace.Write("Starting using Reflection"); 
if (e.Item.GetType() == typeof(GridDataItem)) 
{ 
     bool isWatch = Convert.ToBoolean(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]); 
     if (isWatch) 
     { 
      e.Item.Style["Font-Weight"] = "bold"; 
     } 
} 
Trace.Write("Ending using Reflection"); 
Trace.Write("Starting using Cast"); 
GridDataItem gridItem = e.Item as GridDataItem; 
if (gridItem !=null) 
{ 
    bool isWatch = Convert.ToBoolean(gridItem.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]); 
    if (isWatch) 
    { 
     gridItem.Style["Font-Weight"] = "bold"; 
    } 
    } 
    Trace.Write("Ending using Cast"); 

這是跟蹤輸出我得到

Starting using Reflection 0.79137944962406 0.576538 
Ending using Reflection 0.791600842105263 0.000221 
Starting using Cast 0.791623353383459 0.000023 
Ending using Cast  0.791649308270677 0.000026 
Starting using Reflection 0.876253801503759 0.084604 
Ending using Reflection 0.87631790075188 0.000064 
Starting using Cast 0.87633445112782 0.000017 
Ending using Cast  0.87634950075188 0.000015 

這不是很多,但如果我們不得不這樣做了很多隨着時間的推移它可以增加向上。

+3

隨着時間的推移_Everything_可能會加起來。除非你有證據表明這個實際上是隨着時間的推移累加的,否則不要強調它。 – 2009-07-02 18:25:43

+0

這是關於最佳實踐的更多信息,如果鑄造速度更快,那麼我應該使用鑄造而不是反射 – 2009-07-02 18:47:10

回答

15

由於您在查詢程序集的元數據,因此反射速度很慢,而鑄造只是簡單地改變了您所引用的對象的類型。

程序集的元數據是一個有用的信息存儲區,但該信息最好在編譯時間處使用,而不是在執行時。該元數據被編譯器用於靜態類型檢查(等等)。您正在使用相同的元數據在執行時查找類型信息(如果沒有其他選擇,這很好),這比鑄造速度慢得多。

3

反射必須在運行時去確定對象在運行時具有哪些屬性等。投射告訴應用程序它應該期望一個對象具有X屬性並且應該以某種方式運行。

2

投射告訴運行時你「知道」一個特定對象的類型。雖然您可能會錯誤,但運行時相信您並且不需要花費額外的時間去檢查程序集的元數據。

1

爲什麼不使用is operator?我認爲它更具可讀性,因爲你沒有明確的演員表,然後檢查。它只是檢查變量的類型是否正確。

if (e.Item is GridDataItem) 
{ 
    bool isWatch = Convert.ToBoolean(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]); 
    if (isWatch) 
    { 
     e.Item.Style["Font-Weight"] = "bold"; 
    } 
} 
0

那麼我想一個簡短的答案,最佳實踐部分將永遠不會使用反射,如果你可以得到與常規代碼相同的結果。

在優化代碼時,通常估計優化所花費的時間會帶來最大的性能提升,這通常是一個好主意。在語言本地重新實現操作符很少會在該列表的頂部

1

可以在運行時執行整型比較,但反射涉及完整的方法調用。