我有一些机制来衡量方法执行时间。只需在方法开始时节省时间,最后我节省时间,并比较这两个值。
但每次我想使用它我需要改变方法体。
我正在寻求一种更清洁的方式 - 比如有一个对象负责测量时间,可以封装方法调用 - 比如一些包装器,调用该方法,传递返回值,并在该过程中也测量时间。
另外,我知道它可能是一个小小的科幻小说,但有没有办法包装或附加到所有方法(甚至方法的子集)?它也可以用于例如日志记录 - 比如“我正在调用实例XXX的方法,其中包含参数YYY并返回值为vas ZZZ”?
我知道在Java EE中可以做到这样的事情。 (我认为它被称为拦截器,如果我没记错,他们可以附加到一些或所有方法并添加功能,但我不知道这是否可能在.net)
谢谢。
答案 0 :(得分:5)
我使用了这个简单的方法:
TimeSpan TimeAction(Action action)
{
var sw = new Stopwatch();
sw.Start();
action.Invoke();
sw.Stop();
return sw.Elapsed;
}
这是如何使用它
var time = TimeAction(() =>
{
//your code here
});
答案 1 :(得分:3)
我正在使用带有IDIsposable接口的Stopwatch Wrapper来测量方法/代码块的执行时间。
public class AutoStopwatch : IDisposable
{
private Stopwatch autoStopwatch;
private String method;
public AutoStopwatch(String Method)
{
this.method = Method;
autoStopwatch = Stopwatch.StartNew();
}
public void Dispose()
{
autoStopwatch.Stop();
Debug.Print(string.Format("Elapsed for {0} : {1}", method, autoStopwatch.Elapsed.ToString()));
}
}
}
//示例
using (AutoStopwatch Awatch = new AutoStopwatch("Read Keys from REDIS"))
{
// Your Stuff
}:
答案 2 :(得分:0)
这里很棒的方法是使用面向方面的编程,比如PostSharp ...这里是用于时间测量的示例:http://theburningmonk.com/2010/03/aop-method-execution-time-watcher-with-postsharp/
优点是,您只需在方法中添加属性,而不必更改/“污染”方法体。
干杯, 基督教
答案 3 :(得分:0)
PostSharp Aspects可以帮助您,查看其功能页面上的示例: