문제

의심스러운 코딩 연습이 있습니다.

카운트 제한이있는 작은 항목 목록을 통해 반복해야 할 때 32000, 나는 사용한다 Int16 나를 위해 대신 가변 유형 Integer. 나는 사용한다고 가정하기 때문에 이것을한다 Int16 완전히 날아가는 것보다 더 효율적입니다 Integer.

내가 잘못? AN 사용간에 효과적인 성능 차이가 없습니까? Int16Integer? 사용을 중단해야합니다 Int16 그리고 그냥 고집하십시오 Integer 모든 계산/반복 요구에 대해?

도움이 되었습니까?

해결책

아래 참조에 따르면 실행 시간 성능을 최적화합니다 int32 카운터 및 기타 자주 액세스하는 작업을 권장합니다.

책에서 : MCTS 자체 진행중인 교육 키트 (Exam 70-536) : Microsoft® .NET Framework 2.0 — Application Development Foundation

1 장 : "프레임 워크 기초"
수업 1 : "가치 유형 사용"

모범 사례 : 내장 유형으로 성능을 최적화합니다

런타임은 32 비트 정수 유형 (INT32 및 UINT32)의 성능을 최적화하므로 카운터 및 기타 자주 액세스하는 적분 변수에 해당 유형을 사용하십시오.

부동 소수점 작업의 경우 Double은 하드웨어에 의해 최적화되기 때문에 Double이 가장 효율적인 유형입니다.

또한 동일한 섹션의 표 1-1에는 각 유형에 대한 권장 용도가 나열되어 있습니다. 이 토론과 관련이 있습니다.

  • INT16- 상호 운용 및 기타 특수 용도
  • int32- 정수 및 카운터
  • int64- 큰 정수

다른 팁

당신은해야합니다 거의 언제나 사용 Int32 또는 Int64 (그리고 아니, 당신은 사용하여 신용을 얻지 못합니다. UInt32 또는 UInt64) 인덱스 별 배열 또는 수집을 통해 반복 할 때.

덜 효율적인 가장 분명한 이유는 BCL에서 발견 된 모든 배열 및 수집 인덱스가 Int32s, 그래서 암시 적 캐스트입니다 언제나 사용하려는 코드에서 발생합니다 Int16인덱스로서.

덜 눈에 띄는 이유 (및 배열이 취하는 이유 Int32 인덱스로서) CIL 사양은 모든 작동-스택 값이 어느 하나 Int32 또는 Int64. 다른 정수 유형에 값을로드하거나 저장할 때마다 (Byte, SByte, UInt16, Int16, UInt32, 또는 UInt64), 암시 적 변환 작업이 관련되어 있습니다. 서명되지 않은 유형은 로딩에 대한 페널티가 없지만 값을 저장하기 위해서는 절단 및 오버플로 점검에 해당합니다. 서명 된 유형의 경우 모든 부호-확장 및 모든 상점에 사인-콜랩스를로드하고 오버플로 점검 가능성이 있습니다).

이것이 당신을 가장 상하게 할 곳은 배열이 접근하는 것이 아니라 루프 자체입니다. 예를 들어이 무고한 루프를 사용하십시오.

for (short i = 0; i < 32000; i++) {
    ...
}

좋아 보인다? 아니요! 기본적으로 초기화를 무시할 수 있습니다 (short i = 0) 한 번만 발생하지만 비교 (i<32000) 및 증분 (i++) 부품은 32000 회 발생합니다. 다음은 기계 레벨 에서이 일이 어떻게 보이는지에 대한 Pesudo 코드입니다.

  Int16 i = 0;
LOOP:
  Int32 temp0 = Convert_I16_To_I32(i); // !!!
  if (temp0 >= 32000) goto END;
  ...
  Int32 temp1 = Convert_I16_To_I32(i); // !!!
  Int32 temp2 = temp1 + 1;
  i = Convert_I32_To_I16(temp2); // !!!
  goto LOOP;
END:

거기 있습니다 3 실행중인 전환 32000 타임스. 그리고 그들은 단지 사용함으로써 완전히 피할 수있었습니다. Int32 또는 Int64.

업데이트 : 댓글에서 말했듯이, 지금은이 주제에 대한 블로그 게시물을 작성했습니다. .NET 적분 데이터 유형 및 귀하

int16은 실제로 될 수 있습니다 더 적은 Word Access에 대한 X86 지침은 DWORD 액세스 지침보다 더 많은 공간을 차지하기 때문에 효율적입니다. 그것은 JIT가하는 일에 달려 있습니다. 그러나 무엇이든간에, 그것은 거의 확실하지 않습니다 반복의 변수로 사용될 때 효율적입니다.

그 반대는 사실입니다.

32 (또는 64) 비트 정수는 int16보다 빠릅니다. 일반적으로 기본 데이터 유형이 가장 빠릅니다.

INT16은 데이터 구조를 최대한 희박하게 만들려면 좋습니다. 이것은 공간을 절약하고 성능을 향상시킬 수 있습니다.

현대의 하드웨어에서는 성능 차이가 너무 작아서 모든 의도와 목적을 위해 차이가 없습니다. 몇 개의 테스트 하네스를 작성하고 수백 번 모두 실행하고 평균 루프 완료 시간을 가져 가면 의미하는 바를 알 수 있습니다.

매우 제한된 리소스 - 작은 스택, 느린 네트워크 (예 : GPRS 등)를 위해 설계된 와이어 프로토콜이있는 내장 시스템이있는 경우 스토리지 관점에서 의미가있을 수 있습니다.

효율성을 가정하지 마십시오.

더 효율적이거나 더 효율적이지 않은 것은 컴파일러에서 컴파일러 및 플랫폼마다 다릅니다. 실제로 이것을 테스트하지 않았다면 Int16 또는 Int가 더 효율적인지 여부를 알 수있는 방법이 없습니다.

int16 수정을 사용하는 입증 된 성능 문제를 발견하지 않으면 INT를 고수합니다.

가장 빠른 성능을 위해 32 비트 머신 (또는 64 비트 기계의 Int64)에서 Int32를 사용하십시오. 더 작은 정수 유형을 사용하십시오 진짜 그것이 차지하는 공간에 대해 우려합니다 (그러나 느리게 될 수 있음).

여기 다른 사람들은 정확하고 사용 만 사용합니다 보다 적습니다 int32 (32 비트 코드의 경우)/int64 (64 비트 코드의 경우) 극단적 인 저장소 요구 사항이 필요한 경우 또는 비즈니스 객체 필드의 다른 수준의 시행에 대해 강의).

그리고 일반적으로 성능 문제가있을 때까지 효율성에 대해 걱정하지 마십시오. 그리고이 경우 프로파일을 프로파일 링하십시오. 프로파일 링 중에 두 가지 방법으로 추측 및 확인하면 도움이되지 않으면 IL 코드를 확인하십시오.

그래도 좋은 질문입니다. 컴파일러가 어떻게 작동하는지에 대해 더 많이 배우고 있습니다. 보다 효율적으로 프로그래밍하는 법을 배우려면 IL의 기본 사항을 배우고 C#/VB 컴파일러가 어떻게 작업하는지 배우는 것이 좋은 아이디어가 될 것입니다.

INT16 vs. Int.에 상당한 성능 이득이 있다고 상상할 수 없습니다.

변수 선언에 약간의 비트를 저장합니다.

사양이 변경 될 때 번거 로움과 계산할 때 확실히 가치가 없습니다. ~할 수 있다 지금 32767을 넘어서 신청이 예외를 던지기 시작할 때 ...

int32보다 작은 데이터 유형을 사용하는 데 중요한 성능 게인은 없습니다. 실제로, 메모리 할당으로 인해 Int32를 사용하는 것은 Int16보다 빠른 어딘가에 있습니다.

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