在测试不同方法实现的相对性能时,我发现自己重写了与此类似的函数。
private static long Measure(
int iterations,
Func<string, string> func,
string someParameter)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
for (var i = 0; i < iterations; i++)
{
func(someParameter);
}
stopwatch.Stop();
return stopwatch.ElapsedTicks;
}
不是为我测试的每个方法单一重写这个函数,而是可以编写一个通用的实现来测试任何delagate的性能吗?
的内容 private static long Measure(
int iterations,
Delegate func,
params object[] parameters)
{
...
}
或
private static long Measure<TDelegate>(
int iterations,
TDelegate func,
params object[] parameters)
{
if (!typeof(TDelegate).IsSubclassOf(typeof(Delegate)))
{
throw new ArgumentException("Not a delegate", "func");
}
...
}
如果我能做到这一点,那么在执行迭代之前Compile
和Expression<TDelegate>
是否有意义?
答案 0 :(得分:4)
您可以使用匿名函数传递参数:
var p1 = ..
var p2 = ..
var p3 = ..
var p4 = ..
var p5 = ..
Measure(1000, (x) => MyTestFunc(p1, p2, p3, p4, p5), str);
答案 1 :(得分:4)
为什么不使用Action,你可以在lambda中设置参数。
private static long Measure(int iterations, Action action)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
for (var i = 0; i < iterations; i++)
{
action();
}
stopwatch.Stop();
return stopwatch.ElapsedTicks;
}
然后你称之为
Measure(100, () => MyMethod(arg1,arg2,...));