2

在测试不同方法实现的相对性能时,我发现自己重写了类似的函数。

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>在执行迭代之前是否有意义?

4

2 回答 2

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,...));
于 2012-11-20T18:21:46.653 回答
4

您可以只使用匿名函数来传递参数:

var p1 = ..
var p2 = ..
var p3 = ..
var p4 = ..
var p5 = ..
Measure(1000, (x) => MyTestFunc(p1, p2, p3, p4, p5), str);
于 2012-11-20T18:19:02.243 回答