2012-12-10 3 views
-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; 
    } 
} 
+3

그래서 모든 코드를 주석 처리 할 때 왜 더 빠르는지 궁금 할 것입니다. – Osiris

+0

코드를 프로파일 링하십시오. 침체의 원인을 정확하게 찾아냅니다. 너무 느려서 무슨 뜻이야? 어떻게 알았어? – Oded

+0

@Osiris : 아니요. 주석으로 처리 한 후 더 빠르다는 사실을 알면 주석 처리 된 코드가 속도 저하의 원인이되어야한다고 말합니다. –

답변

0

저는 isValidDate 메소드를 변경하여 코드 속도를 높일 수 있다고 생각합니다. 날짜 패턴과 일치하는 경우 텍스트의 유효성을 검사하는 것으로 알고 있습니다. 이 메서드를 완전히 제거하고 getStandardTime의 DateTime.ParseDateTime.TryParse으로 바꿉니다. 그러면 유효성 검사와 구문 분석이 모두 처리됩니다. 여기를 참조하십시오 DateTime.TryParse Method

날짜의 유효성 검사가 필요한 경우 문자열 repesentation이 아닌 DateTime 구조에서이 작업을 수행하십시오.

또한 두 개의 날짜 (날짜와 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; 
     } 
    }