Double.TryParse 또는 Convert.ToDouble - 어느 것이 더 빠르고 안전합니까?

StackOverflow https://stackoverflow.com/questions/586436

  •  06-09-2019
  •  | 
  •  

문제

내 애플리케이션은 VSTO를 사용하여 Excel 파일을 읽고 읽은 데이터를 StringDictionary.몇 자릿수의 숫자인 데이터만 추가합니다(1000 1000,2 1000,34 - 쉼표는 러시아 표준의 구분 기호입니다).

현재 문자열이 적절한 숫자인지 확인하는 것이 더 낫습니까?

object data, string key; // data had read

try
{
  Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
  dic.Add(key, regionData.ToString());
}
catch (InvalidCastException)
{
  // is not a number
}

또는

double d;
string str = data.ToString();
if (Double.TryParse(str, out d)) // if done, then is a number
{
  dic.Add(key, str);
}

나는 사용해야한다 StringDictionary 대신에 Dictionary<string, double> 다음과 같은 구문 분석 알고리즘 문제로 인해.

내 질문:어느 쪽이 더 빠르나요?어느 것이 더 안전합니까?

그리고 전화하는 것이 더 낫습니까? Convert.ToDouble(object) 또는 Convert.ToDouble(string) ?

도움이 되었습니까?

해결책

릴리스 모드에서 빠른 비과학 테스트를 수행했습니다. 두 가지 입력의 두 가지 입력을 사용했습니다. "2.34523"과 "badinput"을 두 가지 방법 모두에 사용하고 1,000,000 회 반복했습니다.

유효한 입력 :

Double.TryParse = 646ms
Convert.ToDouble = 662 ms

예상대로 크게 다르지 않습니다. 모든 의도와 목적을 위해 유효한 입력의 경우 이들은 동일합니다.

잘못된 입력:

Double.TryParse = 612ms
Convert.ToDouble = ..

글쎄 .. 오랫동안 달리고 있었다. 나는 1,000 개의 반복을 사용하여 모든 것을 다시 달성했다 Convert.ToDouble 나쁜 입력으로 8.3 초가 걸렸습니다. 평균화하면 2 시간 이상이 걸립니다. 유효하지 않은 입력 케이스에서 테스트가 얼마나 기본인지 상관하지 않습니다. Convert.ToDouble예외 제기는 당신의 성과를 망칠 것입니다.

그래서 여기에 또 다른 투표가 있습니다 TryParse 백업 할 숫자가 있습니다.

다른 팁

우선, 나는 double.Parse 오히려 Convert.ToDouble 우선.

사용해야 하는지에 대해서는 Parse 또는 TryParse:잘못된 입력 데이터가 있으면 계속 진행할 수 있나요? 아니면 정말 예외적인 상황인가요?예외적인 경우 다음을 사용하세요. Parse 입력이 잘못되면 폭발하게 놔두세요.예상되고 깔끔하게 처리될 수 있는 경우 다음을 사용하세요. TryParse.

.NET Framework Design Guidelines는 시도 방법을 사용하는 것이 좋습니다. 예외를 피하는 것은 일반적으로 좋은 생각입니다.

Convert.ToDouble(object) 할 것입니다 ((IConvertible) object).ToDouble(null);

전화 할 것입니다 Convert.ToDouble(string, null)

따라서 문자열 버전을 호출하는 것이 더 빠릅니다.

그러나 문자열 버전은 다음을 수행합니다.

if (value == null)
{
    return 0.0;
}
return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);

그래서 더 빠릅니다 double.Parse 곧장.

예외를 처리하지 않으려면 TryParse와 함께 이동하십시오. TryParse는 전체 예외 스택 추적을 처리 할 필요가 없기 때문에 더 빠릅니다.

나는 일반적으로 피하려고 노력합니다 Convert 클래스 (의미 : 나는 그것을 사용하지 않습니다) 매우 혼란 스럽기 때문에 : 코드는 여기에서 정확히 무슨 일이 일어나는지 힌트를 너무 적게합니다. Convert 동일한 코드로 의미 적으로 매우 다른 전환이 발생할 수 있습니다. 이것은 정확히 무슨 일이 일어나고 있는지 프로그래머를 제어하기가 어렵습니다.

그러므로 나의 조언은이 수업을 사용하지 않는 것입니다. 실제로는 필요하지 않습니다 (정상이기 때문에 숫자의 이진 형식을 제외하고 ToString 숫자 클래스의 방법은이를 수행하는 적절한 방법을 제공하지 않습니다).

귀하가 입력 중 100% 일정하지 않으면 드물게는 Double.tryparse를 사용해야합니다.

Convert.ToDouble will throw an exception on non-numbers
Double.Parse will throw an exception on non-numbers or null
Double.TryParse will return false or 0 on any of the above without generating an exception.

예외가 예외보다 훨씬 느리지 않기 때문에 예외를 던질 때 구문 분석 속도는 보조가됩니다.

여기에서 Convert 클래스에 대한 많은 증오 ... 단지 약간의 균형을 잡기 위해 변환에 대한 이점이 하나 있습니다.

Convert.ToDouble(o);

O가 이미 이중 (또는 int 또는 쉽게 캐스팅 가능한 것) 인 경우 값을 쉽게 반환 할 수 있습니다.

Double.parse 또는 Double.tryParse 사용은 이미 문자열에 있으면 좋지만

Double.Parse(o.ToString());

가야합니다 만들다 문자열을 먼저 구문 분석하고 더 비쌀 수있는 입력에 따라 다릅니다.

Double.TryParse IMO.

처리하기가 더 쉽고 오류가 발생한 위치를 정확히 알 수 있습니다.

그런 다음 false를 반환하는 경우(즉, 변환할 수 없는 경우) 적합하다고 생각되는 방식으로 처리할 수 있습니다.

나는 항상 그것을 사용하는 것을 선호했습니다 TryParse() 방법은 예외에 대해 걱정할 필요없이 성공 또는 변환에 실패하기 때문에 방법.

개인적으로, 나는 그것을 발견한다 TryParse 읽기 쉬운 방법, 실제로 사용하려는 제품은 사용 사례에 따라 다릅니다. 오류를 로컬로 처리 할 수있는 경우 오류와 부울을 기대합니다. TryParse 그렇습니다. 그렇지 않으면 예외가 날아가게하고 싶을 수도 있습니다.

나는 기대할 것이다 TryParse 예외 처리의 오버 헤드를 피하기 때문에 더 빨리하십시오. 그러나 벤치 마크 도구를 사용하십시오 Jon Skeet의 미니 벤치 다양한 가능성을 비교합니다.

이것은 흥미로운 오래된 질문입니다. 아무도 원래 질문으로 몇 가지를 눈치 채지 못했기 때문에 답을 추가하고 있습니다.

어느 것이 더 빠릅니다 : convert.todouble 또는 double.tryparse? 더 안전한 것은 무엇입니까 : Convert.todouble 또는 Double.tryparse?

이 두 가지 질문에 모두 답변하겠습니다 (나중에 답변을 업데이트하겠습니다)는 먼저 다음과 같습니다.

안전을 위해, 물건 모든 이 질문에서 놓친 프로그래머는 라인입니다 (강조 광산).

몇 자리 숫자가있는 숫자 인 데이터 만 추가합니다 (1000100,2 1000,34- 쉼표는 러시아 표준의 구분표입니다).

이 코드 예제가 이어집니다.

Convert.ToDouble(regionData, CultureInfo.CurrentCulture);

여기서 흥미로운 점은 스프레드 시트가 러시아 번호 형식이지만 Excel이 셀 필드를 올바르게 입력하지 않은 경우 Excel에서 나오는 값의 올바른 해석은 무엇입니까?

속도와 관련하여 두 가지 예에 대한 또 다른 흥미로운 점은 다음과 같습니다.

catch (InvalidCastException)
{
    // is not a number
}

이것은 다음과 같은 것처럼 보이는 MSIL을 생성 할 것입니다.

catch [mscorlib]System.InvalidCastException 
{
  IL_0023:  stloc.0
  IL_0024:  nop
  IL_0025:  ldloc.0
  IL_0026:  nop
  IL_002b:  nop
  IL_002c:  nop
  IL_002d:  leave.s    IL_002f
}  // end handler
IL_002f: nop
IL_0030: return

이런 의미에서, 우리는 아마도 각 프로그램에서 수행하는 총 MSIL 지침 수를 비교할 수 있습니다. 나중에이 게시물을 업데이트 할 때 더 자세히 설명합니다.

코드가 정확하고 명확하며 빠르야한다고 생각합니다 ... 그와 같은 순서로!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top