我编写了一个日志类和一个函数,如下面的代码所示:
Log(System.Reflection.MethodBase methodBase, string message)
每次我记录某些内容时,我还会从methodBase.Name和methodBase.DeclaringType.Name中记录类名。
我阅读了以下帖子Using Get CurrentMethod,我注意到这种方法很慢。
我应该使用this.GetType()而不是System.Reflection.MethodBase,或者我应该在我的日志中手动记录类/方法名称,例如记录(“ClassName.MethodName”,“日志消息”?什么是最佳做法?
答案 0 :(得分:9)
这取决于。
如果您使用this.GetType()
方法,您将丢失方法信息,但根据您的链接,您将获得很大的性能提升(显然是1200倍)。
如果你提供一个允许调用者提供字符串的接口(例如Log("ClassName.MethodName", "log message")
,你可能会获得更好的性能,但这会使你的API不那么友好(调用开发人员必须提供类名和方法名) )。
答案 1 :(得分:4)
我知道这是一个老问题,但我想我会抛弃一个似乎表现良好且保持符号的简单解决方案
static void Main(string[] args)
{
int loopCount = 1000000; // 1,000,000 (one million) iterations
var timer = new Timer();
timer.Restart();
for (int i = 0; i < loopCount; i++)
Log(MethodBase.GetCurrentMethod(), "whee");
TimeSpan reflectionRunTime = timer.CalculateTime();
timer.Restart();
for (int i = 0; i < loopCount; i++)
Log((Action<string[]>)Main, "whee");
TimeSpan lookupRunTime = timer.CalculateTime();
Console.WriteLine("Reflection Time: {0}ms", reflectionRunTime.TotalMilliseconds);
Console.WriteLine(" Lookup Time: {0}ms", lookupRunTime.TotalMilliseconds);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
public static void Log(Delegate info, string message)
{
// do stuff
}
public static void Log(MethodBase info, string message)
{
// do stuff
}
public class Timer
{
private DateTime _startTime;
public void Restart()
{
_startTime = DateTime.Now;
}
public TimeSpan CalculateTime()
{
return DateTime.Now.Subtract(_startTime);
}
}
运行此代码会给我以下结果:
Reflection Time: 1692.1692ms
Lookup Time: 19.0019ms
Press Enter to exit
对于一百万次迭代, at 并不坏,特别是与直接反射相比。方法组正在转换为Delegate类型,您将一直保持符号链接到日志记录中。没有愚蠢的魔法弦。