我有一個事件處理程序需要確定一個類型並執行代碼,如果它匹配一個特定的類型。最初我們把它轉換成一個對象,如果它不是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
這不是很多,但如果我們不得不這樣做了很多隨着時間的推移它可以增加向上。
隨着時間的推移_Everything_可能會加起來。除非你有證據表明這個實際上是隨着時間的推移累加的,否則不要強調它。 – 2009-07-02 18:25:43
這是關於最佳實踐的更多信息,如果鑄造速度更快,那麼我應該使用鑄造而不是反射 – 2009-07-02 18:47:10