programing tip

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

itbloger 2020. 10. 9. 09:01
반응형

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


내 응용 프로그램은 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 디자인 지침에서는 Try 메서드 사용을 권장합니다. 예외를 피하는 것은 일반적으로 좋은 생각입니다.

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에 대한 한 가지 이점이 있습니다.

Convert.ToDouble(o);

o가 이미 Double (또는 int 또는 쉽게 캐스팅 할 수있는 것)이면 값을 쉽게 반환 할 수 있습니다.

Double.Parse 또는 Double.TryParse를 사용하는 것은 이미 문자열에있는 경우 유용하지만

Double.Parse(o.ToString());

has to go make the string to be parsed first and depending on your input that could be more expensive.


Double.TryParse IMO.

It is easier for you to handle, You'll know exactly where the error occurred.

Then you can deal with it how you see fit if it returns false (i.e could not convert).


I have always preferred using the TryParse() methods because it is going to spit back success or failure to convert without having to worry about exceptions.


Personally, I find the TryParse method easier to read, which one you'll actually want to use depends on your use-case: if errors can be handled locally you are expecting errors and a bool from TryParse is good, else you might want to just let the exceptions fly.

I would expect the TryParse to be faster too, since it avoids the overhead of exception handling. But use a benchmark tool, like Jon Skeet's MiniBench to compare the various possibilities.


This is an interesting old question. I'm adding an answer because nobody noticed a couple of things with the original question.

Which is faster: Convert.ToDouble or Double.TryParse? Which is safer: Convert.ToDouble or Double.TryParse?

I'm going to answer both these questions (I'll update the answer later), in detail, but first:

For safety, the thing every programmer missed in this question is the line (emphasis mine):

It adds only data that are numbers with a few digits (1000 1000,2 1000,34 - comma is a delimiter in Russian standards).

Followed by this code example:

Convert.ToDouble(regionData, CultureInfo.CurrentCulture);

What's interesting here is that if the spreadsheets are in Russian number format but Excel has not correctly typed the cell fields, what is the correct interpretation of the values coming in from Excel?

Here is another interesting thing about the two examples, regarding speed:

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

This is likely going to generate MSIL that looks like this:

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

In this sense, we can probably compare the total number of MSIL instructions carried out by each program - more on that later as I update this post.

I believe code should be Correct, Clear, and Fast... In that order!

참고URL : https://stackoverflow.com/questions/586436/double-tryparse-or-convert-todouble-which-is-faster-and-safer

반응형