0

行ごとに複数の TimeStamp (DateTime) 列を持つ DataTable があります。TimeStamp が DateTime.Now-timeoutValue を渡すと null になるように、タイムアウト値を作成したいと考えています。そして、すべての TimeStamp 値が null になると、その行は削除されます。

現在、タイマーとループで実装されています。多くのエントリで非常に遅延が発生し始めています。より自動化された効率的な方法はありますか? 表情か何か?ここに私のコードの抜粋があります:

public ReadsList(object _readers)
{
    _readers = List of things that add to datatable
    dataTable = new DataTable();
    Timeout = 5;

    aTimer = new System.Timers.Timer(5000);
    aTimer.Elapsed += new ElapsedEventHandler(UpdateReads);
    aTimer.Enabled = true;
}

public void Add(object add)
{
    //Checks if object exists, update TimeStamp if so, else, add new row
}

private void UpdateReads(object source, ElapsedEventArgs e)
{
    //Clean DataTable
    foreach (DataRow row in dataTable.Rows.Cast<DataRow>().ToList())
    {
         int p = 0;
         foreach (var i in _readers)
         {
             p += i.Value;

             for (int b = 1; b <= i.Value; b++)
             {
                 if (row[(i.Key + ":" + b)] != DBNull.Value)
                 {
                     if (Timeout == 0)
                         Timeout = 99999;
                     if (DateTime.Parse(row[(i.Key + ":" + b)].ToString()) <
                         DateTime.UtcNow.AddSeconds(-1*Timeout))
                     {
                         row[(i.Key + ":" + b)] = DBNull.Value;
                     }    
                 }
                 else
                 {
                       p -= 1;
                 }
             }

        }
             //Remove Row if empty
             if (p == 0)
             {
                row.Delete();
                //readCount -= 1;
             }
        }
     dataTable.AcceptChanges();
     OnChanged(EventArgs.Empty);
}
4

2 に答える 2

1

以下は、重要な改善につながる可能性のあるマイナーな改善のアイデアです。

  1. 列キー ( i.Key + ":" + b) を複数回作成しています。内部で一度ビルドforeachし、変数に貼り付けます。
  2. 列 ( row[(i.Key + ":" + b)]) を複数回読んでいます。一度読んで変数に入れておくと、毎回ハッシュテーブルのルックアップを行う必要がなく、複数回使用できます。
  3. タイムアウト ( if (Timeout == 0) Timeout = 99999;) を複数回調整しています。メソッドの最初に一度調整します。
  4. タイムアウト DateTime ( DateTime.UtcNow.AddSeconds(-1*Timeout)) を複数回計算しています。メソッドの開始時に一度計算します。
  5. 常に列の値を文字列で検索しています。列の序数をどこかに保存して代わりに使用できる場合は、パフォーマンスが向上します。foreachいずれかのes内ではなく、メソッドの開始時に列序数を 1 回検索するようにしてください。
  6. 文字列を DateTimes に解析しています。DateTimes を DataTable に格納できれば、毎回解析する必要はありません。
于 2013-06-05T22:09:09.797 に答える