2016-06-21 11 views
1

私はコードを最適化しようとしていますが、関数の実行時間を測定したいと思います。VB NET関数の開始時と終了時にコードを実行する方法

私はChronoというクラスを持っています。ですから、関数の最初にchrono.startを追加し、最後にchrono.stopを追加するだけです。私のクラスちゃんはまた、それが平均時間、合計時間を持って、それがリストで測定する時間を追加します...

それは動作します。関数の途中でexit subまたはreturnがある場合のみ問題です。実際には問題ではなく、私は関数のbeginginfでTryを追加し、最後にchrono.stopを配置します。本当に効率的かどうかはわかりませんが、うまくいきます。

ここに私の質問です:私は関数として関数名を引数として取っておきたい、この関数が呼び出されるとクラスを自動的に起動して停止します。私はリフレクションについて聞いたことがありますが、私はどのようにそれを使用するか分かりません。インターネットでこの質問を検索するのは本当に難しい(言葉があまりにも一般的なので「機能の最後に何かをする」)

私のコードは問題なく動作します。それはちょうど短時間の間、関数にコードを追加することを制限しています(そして、それを削除することを忘れることもあります)。

Thxを(私はフランス人だと私は理解してい願っています)

+1

これを行う正しい方法は、独自のタイマーをローリングさせるのではなく、プロファイラを使用することです。 –

+0

私はそれを行うAOPの方法がありますrembember;とにかく、単にパフォーマンスを測定したいのであれば、VS診断ツールを試してみてください。編集:AOPはオプトインされますが。 –

+0

私はビジュアルスタジオのプロファイラを使用することができます。しかし、アプリケーションの読み込みは遅く、すべてを測定するため結果が得られなくなります。しかし、多分何を測定するかを教える方法があります...私はそれを調べます。私は尋ねるようにそれを行う方法はありませんか? –

答えて

0

これは名前でメソッドを呼び出すためにリフレクションを使用する方法である。

using System.Reflection; 

public int InvokeMethod(string name) 
{ 
    int time1 = 1; //call your chrono.start here. 
    Type thisType = this.GetType(); 
    MethodInfo theMethod = thisType.GetMethod(name); 
    theMethod.Invoke(this, new object[] { 1 }); 
    int time2 = 10; //call your chrono.end here. 
    return time2 - time1; 
} 

しかし、問題があります。関数にどのパラメータを渡すべきか、どのように知っていますか?上のコードでは、たとえば整数1(new object[] { 1 })を渡しています。したがって、このコードは自動化することはできませんが、手動で関数ごとに手動で実行すると、その行を変更して正しい引数を渡し、関数を変更することなく機能させることができます。

これは、リフレクションを使用して名前で関数を呼び出す方法についての質問に答えます。ただし、delegate(または.Net v3.5以降ではFuc<T, tRsult>)を使用して呼び出すほうがはるかに簡単です。

+0

こんにちは。あなたの答えはThx。しかし、私は、特定の機能が起動した時点と終了した時点を検出したいと考えています。このようにして、指定された関数が起動する直前に測定を開始し、実行後に測定を停止することができます。私は(およそ)デリゲートを使用して別の関数から関数を開始する方法を知っています。 –

+0

上記のコードでは、 'int time1 = 1;'行を 'chrono.start'と' int time2 = 10; 'に置き換えますあなたが望むものを正確に得ることができます。 deligateで正確に同じ結果を得ることができます。 'time1'と' time2'の間の3行をデリゲートの呼び出しで置き換えてください。 –

+0

さらに、リフレクションを介して関数を呼び出すことは、その関数への通常の呼び出しよりもかなり遅くなるため、タイミングが間違いなく発生します。非現実世界のタイミングは無駄よりも悪いです。 –

関連する問題