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

私がテストするすべてのメソッドの性質に対してこの関数を書き直すのではなく、パフォーマンステストのための一般的な実装を書くことは可能でしょうか?の線に沿った何か

    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

匿名関数を使用して、パラメーターを渡すことができます。

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 に答える
4

アクションを使用しないのはなぜですか。ラムダでパラメーターを設定できます。

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 に答える