Tengo un controlador de eventos que necesita determinar un tipo y ejecutar código si coincide con un tipo específico. Originalmente lo lanzamos a un objeto y si no era nulo, ejecutamos el código, para acelerarlo utilicé la reflexión y en realidad la ralentizó y no entiendo por qué.¿Por qué el fundido es más rápido que el reflejo en .NET?
aquí es un ejemplo de código
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");
Y este es el resultado de seguimiento consigo
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
que no es mucho, pero si tuviéramos que hacer esto mucho con el tiempo se podría añadir arriba.
_Todo_ podría sumar con el tiempo. A menos que tenga evidencia de que esto 'en realidad' suma con el tiempo, no se preocupe por ello. –
Se trata más de las mejores prácticas, si el casting es más rápido, entonces debería usar el casting en lugar de la reflexión –
Esa lógica no se sigue del todo. Si el casting es CORRECTO, deberías usar casting en lugar de reflection. La corrección es más importante que la velocidad. –