8

このサンプルコードでは、単純なStopWatchを使用して、特定のタスク/アクションを完了するのにかかる時間をテストしています。

StopWatch SW1 = new StopWatch();
SW1.Start();
SomeAction();
SW1.Stop();
sting results = SW1.Elapsed.ToString();
MessageBox.Show(resutls);

テストで使用するためにインスタンス化するクラスが欲しい

public Class PerformanceTests
{
   public StopWatch SW1 = new StopWatch();
   public StopWatch SW2 = new StopWatch();
   public string results1 = "", results2 = "";
   ....
   ....
   //some other variables to use 
}

ただし、クラスをインスタンス化して使用しようとしてもSW1、そのメソッドを使用できません。私は何が間違っているのですか?

PerformanceTests Ptst = new PerformanceTests();
Ptst.SW1. ... Start() is not accessible

アップデート

残りの回答については、大文字と小文字が区別されないため、コードをコピーしないでくださいstopwatch。ストップウォッチクラスをインスタンス化する代わりに、Visual Studioが誤って、.NETの実際の代わりにいわゆるストップウォッチのクラスを作成するかどうかを尋ねるのに注意を払っていませんでしたStopwatch

ですから、私のアドバイスですが、Visual Studioインテリセンスの推奨されるアクションは、常に同じである必要がありますが、注意してください。あなたが本当に経験を積んで、すべてのクラスを心から知るまで、ただ確かめてください。

4

3 に答える 3

25

コードブロックの実行時間を測定するのに役立つ簡単なクラスを次に示します。

public class PerformanceTester : IDisposable
{
    private Stopwatch _stopwatch = new Stopwatch();
    private Action<TimeSpan> _callback;

    public PerformanceTester()
    {
        _stopwatch.Start();
    }

    public PerformanceTester(Action<TimeSpan> callback) : this()
    {
        _callback = callback;            
    }

    public static PerformanceTester Start(Action<TimeSpan> callback)
    {
        return new PerformanceTester(callback);
    }

    public void Dispose()
    {
        _stopwatch.Stop();
        if (_callback != null)
            _callback(Result);
    }

    public TimeSpan Result
    {
        get { return _stopwatch.Elapsed; }
    }
}

使用法(を使用してコードブロックをラップするだけですPerformanceTester):

using (var tester = new PerformanceTester())
{
    // code to test
    MessageBox.Show(tester.Results.ToString());
}

ブロックの前にテスター変数を宣言すると、ブロックusingを終了するとストップウォッチが自動的に停止usingし、結果が利用可能になります。

PerformanceTester tester;

using (tester = new PerformanceTester())    
    SomeAction();

MessageBox.Show(tester.Results.ToString());

にコールバックアクションを渡すとPerformanceTester、このアクションはステートメントの最後に呼び出され、using経過時間がコールバックに渡されます。

using (PerformanceTester.Start(ts => MessageBox.Show(ts.ToString())))
     SomeAction();

結果を受け入れTimeSpanて処理するメソッドを宣言できます。

private void ProcessResult(TimeSpan span)
{
   // log, show, etc
   MessageBox.Show(span.ToString());
}

使用法は非常にきれいになります:

using (PerformanceTester.Start(ProcessResult))
     SomeAction();
于 2012-12-03T11:01:06.440 に答える
1

それらをプライベートではなくパブリックにします。

 public class PerformanceTests
    {
        public StopWatch SW1 { get; set; }

        public StopWatch SW2 { get; set; }

        public string Results1 { get; set; }

        public string Results2 { get; set; }

        public PerformanceTests()
        {
            this.SW1 = new StopWatch();
            this.SW2 = new StopWatch();
        }
    }
于 2012-12-03T11:00:46.643 に答える
0

カスタムクラスを使用している場合を除いて、StopWatchは正しいクラス名ではありません。名前空間でStopwatchを試してください。System.Diagnostics

試す:

public Class PerformanceTests
{
   public Stopwatch SW1 = new Stopwatch();
   public Stopwatch SW2 = new Stopwatch();
   public string results1 = "", results2 = "";
   ....
   ....
   //some other variables to use 
}
于 2012-12-03T11:01:21.730 に答える