问题描述
我正在尝试跟踪.NET核心应用程序和引用的库的指标。指标如:延迟,吞吐量,计数,大小,.. etc。
例如,假设我正在实施延迟指标,那么我将必须围绕要计算延迟的每种方法,如下所示:
var sw = Stopwatch.StartNew();
var result = MyFunction(input1,input2,input3);
sw.Stop();
// set latency out
latency = sw.ElapsedMilliseconds;
return result;
我正在尝试查看C#中是否有更简洁的方法。我想传递一个委托方法并定义一个这样的函数,以避免重复Stopwatch.StartNew()
和sw.Stop()
public static TResult CollectLatency<T,U,V,TResult>(Func<T,TResult> func,out long latency,T input1,U input2,V input3)
{
var sw = Stopwatch.StartNew();
var result = func(input1,input3);
sw.Stop();
// set latency out
latency = sw.ElapsedMilliseconds;
return result;
}
但是然后我将不得不根据要测量延迟的所有方法来定义此方法的重载,使其具有不同的输入数量。
我想到的一个解决方案是只有一个输入,并且要测量的所有方法都只有一个参数(包括所有参数的类引用类型)。但是,这不是一个选择,因为这些方法已有现有的外部使用者,并且在升级过程中会破坏它们。
还有其他可以探索的解决方案吗?
解决方法
您可以将参数传递为closed variables,这样就无需为每种类型的参数实现重载。
public static long CollectLatency(Action action)
{
var sw = Stopwatch.StartNew();
action();
sw.Stop();
return sw.ElapsedMilliseconds;
}
然后您将其称为tis:
var latency = CollectLatency( () => MyFunction(input1,input2,input3) );
如果您确实需要结果,而不仅仅是等待时间,还可以将其收集在封闭变量中。
SomeType result;
var latency = CollectLatency( () => result = MyFunction(input1,input3) );