-1

日付を比較して検証するコードがあります。

問題:

このコードは、実行中に時間がかかりすぎています。このコードにコメントすると、実行にかかる時間が大幅に短縮されます。これから、このコードにはオーバーヘッドがあることがわかります。このコードの効率を改善するための提案をしてください。

DateTime regDate;
DateTime dob;

extractDate(buffer[5], buffer[6], out regDate, out dob);

private void extractDate(string date, string rDate, out DateTime regDate, out DateTime dob)
{
    if (date == "")     // Date of birth is not given;
    {
        regDate = getStandardDate(rDate);   // MM/DD/YYYY
        dob = regDate.AddYears(-18);
    }
    else
    {
        dob = getStandardDate(date);
    }

    if (rDate == "")
    {
        dob = getStandardDate(date);
        regDate = dob.AddYears(18);
    }
    else
    {
        regDate = getStandardDate(rDate);
    }
} 

private DateTime getStandardDate(string date)
{
    bool checkDate = isValidDate(date);
    if (checkDate)
    {
        IFormatProvider culture = new System.Globalization.CultureInfo("en-gb", true);
        DateTime dt;
        if (karachiDateFormat)
        {
            dt = DateTime.Parse(date);
        }
        else
        {
            dt = DateTime.Parse(date, culture);
        }


        return dt.Date;
    }
    else
    {
        return DateTime.Now.Date;
    }
}

private bool isValidDate(string date)
{
    IFormatProvider culture = new System.Globalization.CultureInfo("en-gb", true);
    DateTime Ttime;
    if (!karachiDateFormat)
    {
        Ttime = DateTime.Parse(date, culture);
    }
    else
    {
        Ttime = DateTime.Parse(date);
    }

    date = string.Empty;
    date = Ttime.Date.ToShortDateString();
    string[] splitDate = date.Split('/');

    int day = Int32.Parse(splitDate[1]);
    int month, year;
    month = Int32.Parse(splitDate[0]);

    year = Int32.Parse(splitDate[2]);
    DateTime time = DateTime.Now;
    if ((day > 0 && day < 32) && (month > 0 && month <= 12) && (year > 1950 && year < time.Year))
    {
        return true;
    }
    else
    {
        return false;
    }
}
4

1 に答える 1

0

isValidDate メソッドを変更することで、コードを高速化できると思います。私が理解していることから、日付パターンと一致する場合、テキストを検証します。DateTime.Parseこのメソッドを完全に削除して、getStandardTime を次のように置き換えてみますDateTime.TryParse。これにより、検証と解析の両方が処理されます。こちらをご覧くださいDateTime.TryParse メソッド

日付の検証が必要な場合は、文字列表現ではなく、DateTime 構造でこれを行います。

また、2 つの日付 (date と rDate) を解析しています。おそらくParallel.Invokeを使用すると役立つかもしれませんが、これについてはわかりません。

    private void extractDate(string date, string rDate, out DateTime regDate, out DateTime dob)
    {
        Parallel.Invoke(
            () =>
            {
                if (date == "")     // Date of birth is not given;
                {
                    regDate = getStandardDate(rDate);   // MM/DD/YYYY
                    dob = regDate.AddYears(-18);
                }
                else
                {
                    dob = getStandardDate(date);
                }
            },
        () =>
        {

            if (rDate == "")
            {
                dob = getStandardDate(date);
                regDate = dob.AddYears(18);
            }
            else
            {
                regDate = getStandardDate(rDate);
            }
        });
    }

    private DateTime getStandardDate(string date)
    {
        IFormatProvider culture = new System.Globalization.CultureInfo("en-gb", true);
        DateTime dt;
        if (karachiDateFormat)
        {
            if (!DateTime.TryParse(date, out dt))
                dt = DateTime.Now.Date;
        }
        else
        {
            if (!DateTime.TryParse(date, culture, out dt))
                dt = DateTime.Now.Date;
        }
    }
于 2012-12-10T10:35:49.970 に答える