문제

문자열로 값이 저장되어 있습니다. DataTable 여기서 각 값은 실제로 int, double, 또는 string (외부 데이터 소스에서 가져오기 프로세스 중에 모두 문자열로 변환되었습니다.)각 값이 실제로 어떤 유형인지 테스트하고 확인해야 합니다.

응용 프로그램에 더 효율적인 것은 무엇입니까(또는 실질적인 차이가 없습니까)?

  1. 다음으로 변환해 보세요. int (그런 다음 double).변환이 작동하면 반환됩니다. true.예외가 발생하면 반환 false.
  2. 패턴과 일치하도록 설계된 정규 표현식 int 또는 double
  3. 다른 방법이 있나요?
도움이 되었습니까?

해결책

double.TryParse를 사용하면 성능상의 이점이 있습니다.

다른 팁

나는 그러한 마이크로 성능에 대해 너무 걱정하지 않는다고 말하고 싶습니다.뭔가 작동하도록 한 다음 가능한 한 명확하고 간결하며 읽기 쉽게 만드는 것이 훨씬 낫습니다.당신이 할 수 있는 최악의 일은 미미한 성능을 위해 가독성을 희생하는 것입니다.

결국, 성능 문제를 처리하는 가장 좋은 방법은 실제 성능 문제가 있음을 나타내는 데이터가 있을 때를 대비해 이를 저장하는 것입니다...그렇지 않으면 미세 최적화에 많은 시간을 소비하게 되고 실제로 나중에 유지 관리 비용이 더 많이 발생하게 됩니다.

이러한 구문 분석 상황이 실제로 애플리케이션의 병목 현상이라고 판단되면 문제를 해결하는 가장 빠른 방법이 무엇인지 알아내려고 노력할 때입니다.제 생각에는 Jeff(그리고 다른 많은 사람들)가 이런 종류의 일에 대해 블로그에 많이 글을 올렸던 것 같습니다.

최적화를 사용하여 컴파일하는지 여부에 따라 다양한 방법에 대해 서로 다른 결과를 얻을 수 있습니다.기본적으로 몇 가지 옵션이 있습니다.

object o;

//checking with is
o is int

//check type
o.GetType() != typeof( int )

//cast and catch exception
try{ int j = (int) o; } 
catch {}

//use the tryparse
int.TryParse( Convert.ToString( o ), out j )

이러한 10,000번을 각각 시도하고 각각의 기간을 반환하는 콘솔 앱을 쉽게 설정할 수 있습니다(o가 int일 때와 다른 것일 때 테스트).

그만큼 try-catch 메서드는 개체가 int를 보유하는 경우 가장 빠르고, 그렇지 않은 경우에는 가장 느립니다(심지어 GetType). int.TryParse 문자열이 있으면 꽤 빠르지만 알 수 없는 개체가 있으면 속도가 느려집니다.

흥미롭게도 .Net 3.5 및 최적화 기능이 켜져 있습니다. o is int 확인하는 데 동일한 시간이 소요됩니다. try-catch o가 실제로 int일 때. o is int o가 실제로 다른 경우에만 약간 느려집니다.

짜증나게도 FxCop은 다음과 같은 작업을 수행하면 경고를 표시합니다.

if( o is int )
    int j = (int) o;

하지만 내 생각에는 FxCop의 버그인 것 같습니다. int가 값 유형인지 모르고 사용하도록 권장합니다. o as int 대신에.

입력이 항상 문자열인 경우 int.TryParse 최선이고 그렇지 않으면 is 운영자가 가장 빠릅니다.

문자열이 있으므로 그것이 double이 아니라 int인지 알아야 하는지 살펴보겠습니다.만약에 int.TryParse 그럼 지나갈 거야 double.TryParse 따라서 검사 수를 절반으로 줄일 수 있습니다. double 또는 문자열을 반환하고 int가 필요할 때 double을 바닥에 놓습니다.

문제는 대답이 세 가지 유형 모두일 수 있는 상황이 있을 수 있다는 것입니다.

3은 int, double 또는 문자열이 될 수 있습니다!

이는 수행하려는 작업과 해당 유형이 특정 유형이라는 것이 얼마나 중요한지에 따라 다릅니다.가능한 한 오랫동안 그대로 두는 것이 가장 좋을 수도 있고, 또는 원본 문자열의 소스를 제어할 수 있는 경우 각 문자열을 표시하는 방법을 추가하는 것이 가장 좋습니다.

저는 개인적으로 int.tryparse를 사용한 다음 double.tryparse를 사용합니다.이러한 방법의 성능은 매우 빠릅니다.둘 다 부울을 반환합니다.둘 다 실패하면 데이터를 정의한 방법에 따라 문자열이 생성됩니다.

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