通用功能测试任何委托的性能(Generic function to test the perform

2019-07-04 00:55发布

当测试不同的方法实现的相对表现,我发现自己重新编写类似这样的功能。

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;
}

而不是重写此功能singnature,我测试的每一个方法,这将是可以写入性能测试任何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");
    }

    ...
}

如果我能做到这将是有意义的CompileExpression<TDelegate>执行迭代过吗?

Answer 1:

为什么不使用一个行动,你可以在一λ设定的参数。

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,...));


Answer 2:

你可以只用一个匿名函数传递参数:

var p1 = ..
var p2 = ..
var p3 = ..
var p4 = ..
var p5 = ..
Measure(1000, (x) => MyTestFunc(p1, p2, p3, p4, p5), str);


文章来源: Generic function to test the performance of any delegate