0

デスクトップアプリケーションを作成しましたが、時々少し遅いので、可能な限り最適化しようとしています。問題は、方法がわからないことです。

これが私が質問しているコードです

if (((mainRibbonForm)Parent.Parent.Parent.Parent.Parent.Parent.Parent)).myParentScopeVar == false)
{
   //something goes here

}

//VS

if (myLocalScopeVar == false)
{
    //something goes here
}

すべてのオブジェクトはmainRibbonFormで作成され、割り当てられています。このようなものを呼び出すことはできないようです。

mainRibbonForm.myparentScopeVar == false

したがって、最後のオブジェクトにいる間、Parentコマンド変数を使用して変数を取得するために後方に歩きました。

変数の親スコープを常に確認するか、変数をローカルスコープとして最後のコントロールに割り当て、親スコープ変数が変更されたときにのみ更新する必要があるかどうかはわかりません。これはあまり頻繁ではありませんが、変更されます。

私はこれらのいくつかをタイマーに入れて、コードのいたるところにこだわっています。私はC#に非常に慣れておらず、VB.NetからC#にすべてを翻訳しました。C#でのプログラミングの正しいまたはベストプラクティスを学ぼうとしています。

どちらがより速く、より少ないリソースを使用しますか?

次回、自分でベンチマークを行うにはどうすればよいですか?

4

1 に答える 1

1

私はこのコードが見過ぎて恐ろしいと思います:

if (((mainRibbonForm)Parent.Parent.Parent.Parent.Parent.Parent.Parent)).myParentScopeVar == false)
{
   //something goes here   
}

これの代わりに、静的変数を使用してから、を使用して呼び出すことをお勧めしmainRibbonForm.myParentScopeVarます。したがって、これをクラスに挿入できます。

public static bool myParentScopeVar;

または、このブール値をコンストラクターに渡すこともできます。


ベンチマークを実行する場合Stopwatchは、高解像度タイマーであるクラスを使用して、コードの実行時間を測定し、テストしているコードをループして、最高と最低のパフォーマンスを含む中程度の時間を取得します。

Stopwatch timer = new Stopwatch();
timer.Start();

for(int i = 0; i < 1000; i++)
{
    if (((mainRibbonForm)Parent.Parent.Parent.Parent.Parent.Parent.Parent)).myParentScopeVar == false)
    {
         //something goes here   
    }
}

timer.Stop();  
TimeSpan timespan = timer.Elapsed;

MessageBox.Show(String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10));    

timer.Restart();

for(int i = 0; i < 1000; i++)
{
    if (myLocalScopeVar == false)
    {
         //something goes here
    }
}

timer.Stop();  
TimeSpan timespan = timer.Elapsed;

MessageBox.Show(String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10)); 

私のソリューションと使用する2番目のソリューションのmyLocalScopeVar方が効率的だと思います。

于 2012-09-01T21:04:26.247 に答える