对于错误事件日志,甚至对于应用程序函数或方法完成日志,反射调用的性能通常不是问题。特别是因为通常最好使用反射调用而不是在每个类和方法中都有一个命名字符串。
对 MethodBase 的调用不应用于任何性能关键部分。在这些情况下,反射值应该在使用之前缓存,如果可能的话,或者使用替代对象,例如前面提到的命名字符串。
例如。日志(m_zClassName,zMethodName,“方法 Wizbot 完成。”);
基准
在我的 i7-2600k 的基准测试中,每次调用 MethodBase.GetCurrentMethod() 大约需要 1600 纳秒(0.0016 毫秒)。
改进
话虽如此,OP 发布的代码可以通过不调用 MethodBase.GetCurrentMethod()两次来显着提高性能,因为我们想要的是同一个对象的两个成员。
两个 MethodBase.GetCurrentMethod() 调用中的 OP 代码(带有一些格式)= ~3200ns:
Log(String.Concat(MethodBase.GetCurrentMethod().DeclaringType.Name, ".", MethodBase.GetCurrentMethod().Name, " : Error is blah blah");
只需在一次 MethodBase.GetCurrentMethod() 调用中将 MethodBase 对象的引用传递给事件日志写入方法 = ~1600ns,它的执行速度就可以提高一倍:
EventLogWrite(MethodBase.GetCurrentMethod(), "Error is blah blah");
以及事件日志的写法:
public static void EventLogWrite(MethodBase methodBase, string zErrorMessage)
{
string classname = methodBase.DeclaringType.Name;
string methodname = methodBase.Name;
string logmessage = String.Concat(classname, ".", methodname, " : ", zErrorMessage);
// ... write message to event log file
}
此外,通过这种设计,您无需在调用事件日志写入方法的每个实例中都键入所有 String.Concat 和字段分隔符。