0

.mdb ファイルのタイム パンチを調整する Windows フォーム アプリケーションのリファクタリングに取り組んでいます。このプログラムは、昼食、休憩、終業時間などの要因に基づいてパンチの切り上げ/切り下げを行い、残業の要件に基づいて賃金を計算します。また、特定の時間エントリを検索し、不適切なパンチ (間違った顧客 ID、タスク番号など) を手動で修正するための GUI としても使用されます。複雑すぎることはありません。このアプリケーションは、もともと 2004 年に ADO.Net を使用して作成されました。オフィスの XP コンピューターでは正常に動作しますが、Windows 7 を実行しているコンピューターではすぐにクラッシュするため、リファクタリングを開始しました。.Net Reflector を使用して逆コンパイルし、Visual Studio Express 2012 で取り組んできた ac# プロジェクトを作成しました。再コンパイルする前に修正しなければならない構文エラーがいくつかありました。しかし、実行後、Windows 7 で完全に動作するアプリケーションができました (元のアプリに対してかなりの数のテストを実行し、再コンパイルされたバージョンが調整を正しく実行していると確信しています)。ほんの少しの変更で正確に機能する理由を説明できませんでしたが、これでわかりました (それを見つけてもかまいませんが、それは私の主な質問ではありません)。私が抱えている問題は、XP を実行している恐竜で約 1 分かかる計算が、Windows 7 を実行している箱から出してすぐに使用できるデスクトップでは約 20 分かかることです。この特定の計算には、未処理のレコード (アプリケーションの起動時に、テーブル内のブール フィールドでマークされます)。レコードの取得元のテーブルには ~235000 のレコードがあり、そのうち ~250 が未処理としてマークされています。未処理のレコード数を 5 つに減らすと、所要時間は最大 10 分に短縮されますが、合計レコード数を数千に減らすと、プログラムはほぼ瞬時に実行されます。ただし、現時点ではそれは実際にはオプションではありません。アプリをデバッグ モードで実行すると、次の方法で問題を追跡できます。

[HelpKeyword("vs.data.TableAdapter"), DebuggerNonUserCode, DataObjectMethod(DataObjectMethodType.Select, false)]
    public virtual dsHours.workDataTable GetDataByWeek(string EmployeeID, DateTime? Date_Entered, DateTime? Date_Entered1)
    {
        this.Adapter.SelectCommand = this.CommandCollection[1];
        if (EmployeeID == null)
        {
            this.Adapter.SelectCommand.Parameters[0].Value = DBNull.Value;
        }
        else
        {
            this.Adapter.SelectCommand.Parameters[0].Value = EmployeeID;
        }
        if (Date_Entered.HasValue)
        {
            this.Adapter.SelectCommand.Parameters[1].Value = Date_Entered.Value;
        }
        else
        {
            this.Adapter.SelectCommand.Parameters[1].Value = DBNull.Value;
        }
        if (Date_Entered1.HasValue)
        {
            this.Adapter.SelectCommand.Parameters[2].Value = Date_Entered1.Value;
        }
        else
        {
            this.Adapter.SelectCommand.Parameters[2].Value = DBNull.Value;
        }
        dsHours.workDataTable dataTable = new dsHours.workDataTable();
        this.Adapter.Fill(dataTable);
        return dataTable;
    }

WorkDataTable クラスは、System.Data.DataTable を拡張して System.Collections.IEnumerable を実装し、.mdb バックエンドの作業テーブルに特定の書式を追加する単なるクラスです。このコードの実行速度が非常に遅い理由を理解するために誰かが私を正しい方向に向けることができれば、本当に感謝しています。もちろん、さらにコードや情報が必要な場合は、喜んで提供します。

4

1 に答える 1