ホーム > .NET Framework | Tips | プログラミング > Stopwatchって普通ラップタイム計測できるよね

Stopwatchって普通ラップタイム計測できるよね

でも、.NET FrameworkのSystem.Diagnostics.Stopwatchはちょっと不便。

  • ラップタイムが計測できない。
  • ElapsedMillisecondsプロパティがlong型で、精度が悪い。
  • 精度よく計測するために毎回ElapsedTicksとStopwatch.Frequencyを使ってごにょごにょしないといけない。

というわけで、最初にNewしてStartして、プログラム上のいろんな位置でLapTimeを測って、後で全部をミリ秒単位のdouble配列で取り出すサンプル。
実行速度検証にどうぞ。

public class k2kLapStopwatch : Stopwatch
{
    private long[] LapTicks;
    private int LapCounter;
 
    public k2kLapStopwatch(int MaxLapCount)
    {
        LapTicks = new long[MaxLapCount];
        LapCounter = 0;
    }
 
    public void StoreLap()
    {
        LapTicks[LapCounter] = base.ElapsedTicks;
        LapCounter++;
    }
 
    public double[] GetLapElapsedMilliseconds()
    {
        int i;
        double[] ret = new double[LapCounter];
 
        ret[0] = TicksToMilliseconds(LapTicks[0]);
        for (i = 1; i < LapCounter; i++)
        {
            ret[i] = TicksToMilliseconds(LapTicks[i] - LapTicks[i - 1]);
        }
        return ret;
    }
    private double TicksToMilliseconds(long Ticks)
    {
        return (double)Ticks / Stopwatch.Frequency * 1000.0;
    }
}

目的上速さが重要なので、System.Collections.Generic.Listとかは使わないし、オーバーフローしても無視ってことで。
早速↑が正しいか検証するために、List、容量指定のList、ふつうの配列の速度測ってみると、やっぱり配列が容量未指定のListの2倍ぐらい速い。

細かいことだとLapTicksはpublicでもいいかも。あとStartNewをオーバーライドしたりして使おうかな。。

private void button1_Click(object sender, EventArgs e)
{
    const int n = 1000000;
    int i;
 
    k2kLapStopwatch sw = new k2kLapStopwatch(5);
 
    List<long> list1 = new List<long>();
    List<long> list2 = new List<long>(n);
    long[] array1 = new long[n];
 
    sw.Start();
    for (i = 0; i < n; i++) list1.Add(i);
    sw.StoreLap();
    for (i = 0; i < n; i++) list2.Add(i);
    sw.StoreLap();
    for (i = 0; i < n; i++) array1[i] = i;
    sw.StoreLap();
    for (i = 0; i < n; i++) ;
    sw.StoreLap();
 
    sw.Stop();
 
    double[] ret = sw.GetLapElapsedMilliseconds();
    Console.WriteLine(string.Join(",", Array.ConvertAll<double, string>(ret, d => d.ToString())));
}

コメント:0

コメントフォーム
入力した情報を記憶する

トラックバック:0

この記事のトラックバック URL
http://ka.taoka.info/wp-trackback.php?p=90
トラックバックの送信元リスト
Stopwatchって普通ラップタイム計測できるよね - ka.taoka.info より

ホーム > .NET Framework | Tips | プログラミング > Stopwatchって普通ラップタイム計測できるよね

カレンダー
« 2018 年 1月 »
S M T W T F S
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
最近の反応
メタ情報

ページの上部に戻る