在C#中对代码执行自己的运行时分析

时间:2009-08-12 00:40:35

标签: c# .net logging performance

我已经在很多类中编写了一个包含许多方法的大型C#应用程序。

我正在尝试记录所调用的内容以及开发过程中的频率。 (我在数据库中保留记录)

使用以下调用填充每个方法:

void myMethod()
{
log(entering,args[]);

log(exiting,args[]);
}

由于我想为我的所有方法执行此操作,是否有更好的方法来执行此操作,然后必须在每个方法中复制这些代码行?

4 个答案:

答案 0 :(得分:5)

查看http://www.postsharp.org/

这是他们头版的第一个例子:

public class TraceAttribute : OnMethodBoundaryAspect 
{ 
  public override void OnEntry( MethodExecutionEventArgs eventArgs) 
  { Trace.TraceInformation("Entering {0}.", eventArgs.Method);  } 

  public override void OnExit( MethodExecutionEventArgs eventArgs) 
  { Trace.TraceInformation("Leaving {0}.", eventArgs.Method);   } 
}

似乎正是你所需要的!

答案 1 :(得分:1)

好吧,您可以在类上使用某种类型的Decorator来记录事物,但我认为更好的方法是在构建和/或单元测试过程中使用某种类型的分析工具。您可以很容易地从CruiseControl中的一些简单的度量标准集合中获得很多价值。

答案 2 :(得分:1)

你需要一个探查器。 C#有两个“主要”的。 JetBrains“dotTrace”和“YourKit”都很好,但我更喜欢YourKit。这是一项很好的投资。我想你会发现你不会经常使用它......但是当你需要它时它们很棒。

答案 3 :(得分:1)

如果你真正 之后

就在今天早上,有人发给我一个非常大的数据集,可以在我们公司正在构建的大型C#应用程序中运行。它太慢了我几乎无法抗拒它。

由于我在VS IDE下运行,我只是暂停了几次并查看它在做什么以及为什么。它正在做一些无法记录或猜测的东西。修复很简单,加速很快。

当性能问题不那么糟糕时,可能需要多个样本才能找到它们,但它总是有效并且不会更简单。