我想知道我是否可以在我的开发场景中使用#if,我想捕获每个方法在生产环境中的执行时间。
为此,我考虑使用秒表类,并根据配置文件中设置的条件将经过的时间写入日志中。在配置文件中,我们有一个名为Loglevel的选项,它保存诸如"Error,debug,info,All"之类的值。在生产中,我们将日志级别类型设置为"错误",以便只捕获错误。2因此,我将要写入的日志将不会写入文件中。当客户报告问题时,我们会将错误日志设置更改为调试,以便将所有信息写入日志。
但是,我不想采取这种方法,因为即使我将LogLevel值设置为仅捕获错误,也会执行不必要的代码行。因此,计划使用#if调试来捕获执行时间。我不确定在不替换在发布模式下构建的dll或项目文件的情况下,这是否适用于生产环境。#if调试在发布模式下是否适用?如果是这样的话,我如何使代码行执行捕获执行时间,而不替换文件,只改变配置?
下面是示例代码
public int process()
{
#if Debug
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
#endif
Int a = 20;
Int b = 30;
Int c = a+ b;
#if Debug
stopwatch.Stop();
this.WritePerformanceLog(0, System.Reflection.MethodInfo.GetCurrentMethod().ReflectedType.ToString()+" "+System.Reflection.MethodInfo.GetCurrentMethod().Name, "API", DateTime.UtcNow, DateTime.UtcNow,stopwatch.Elapsed.ToString());
stopwatch = null;
#endif
return C
}
1条答案
按热度按时间qojgxg4l1#
我希望捕获生产环境中每个方法的执行时间。
使用分析器。
虽然秒表的开销很低,但是为 * 每个方法调用 * 写入日志只会破坏你的性能。用#if指令来启用秒表会让你的代码变得不可读,甚至可能无法很好地测量性能。
分析器正是为此目的而设计的,应该在根本不改变程序集的情况下工作,并且应该具有相当低的开销,这取决于您使用的模式。Visual studio has a profiler built in,但是也有第三方分析器。
秒表可以用来检查运行时的 * 特定方法 *,这些方法已知很慢,并且您可能希望在任何情况下都记录日志,因此添加秒表基本上是免费的,在数据库调用或类似操作花费的时间比预期长得多的情况下,秒表可能是有用的诊断工具。