programing

.NET 정수 대 Int16?

magicmemo 2023. 5. 16. 22:29
반응형

.NET 정수 대 Int16?

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

카운트 제한 미만인 소수의 항목 목록을 반복해야 하는 경우32000사용합니다Int16대신에 내 i 변수 유형에 대해.Integer제가 이것을 하는 이유는 제가 사용하는 것을 가정하기 때문입니다.Int16풀 블로우보다 효율적입니다.Integer.

내가 틀렸나요?사용하는 것 사이에 효과적인 성능 차이가 있습니까?Int16 vsanInteger사용을 중지해야 합니까?Int16그리고 그냥 계속.Integer내가 필요로 하는 모든 것들을 위해?

거의 항상 사용해야 합니다.Int32또는Int64(그리고 아니요, 당신은 사용함으로써 신용을 얻지 못합니다.UInt32또는UInt64 배열 또는 컬렉션을 인덱스별로 루프할 때 사용합니다.

가장 배열 및 인덱스가 BCL에서 사용되기 입니다.Int32s, 그래서 암묵적인 캐스팅은 항상 사용하려고 하는 코드에서 발생할 입니다.Int16색인으로서

명확하지 않은 이유(및 어레이에 필요한 이유)Int32index)는 CIL 규격에 따르면 모든 연산-스택 값은 다음 중 하나입니다. Int32또는Int64하거나 다른 유형에 마다 ("" "" " " " " " " " " ")Byte,SByte,UInt16,Int16,UInt32또는UInt64), 암시적 변환 작업이 관련되어 있습니다.서명되지 않은 유형은 로드에 대한 페널티가 없지만 값을 저장하는 경우 이는 잘라내기와 오버플로 검사 가능성에 해당합니다.서명된 유형의 경우 모든 로드 부호 확장 및 모든 스토어 부호 축소(및 오버플로 검사 가능).

이것이 여러분에게 가장 큰 피해를 줄 것은 어레이 액세스가 아니라 루프 자체입니다.다음과 같은 순수해 보이는 루프를 예로 들어 보겠습니다.

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

맛있겠다, 그치?.short i = 0번밖에 않기 ) 한밖번일않때지문하지, 비는교만에기어 (i<32000및 및분증(증()i++ 발생합니다 부품은 32,000번 발생합니다.여기 기계 수준에서 이것이 어떻게 보이는지에 대한 몇 가지 페수도 코드가 있습니다.

  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 통합 데이터 유형 및 사용자

아래 참조에 따르면 런타임Int32의 성능을 최적화하고 카운터 및 기타 자주 액세스하는 작업에 권장합니다.

MCTS 자가 학습 키트(시험 70-536)의 내용: Microsoft®.NET Framework 2.0-애플리케이션 개발 기반

"1장: "기본 원리"
1: "유형 " 주제 1: "값 유형 사용"

모범 사례:기본 제공 유형으로 성능 최적화

런타임은 32비트 정수 유형(Int32 및 UInt32)의 성능을 최적화하므로 카운터 및 기타 자주 액세스하는 정수 변수에 이러한 유형을 사용합니다.

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

또한 같은 섹션의 표 1-1에는 각 유형별 권장 용도가 나와 있습니다.이 논의와 관련된 내용:

  • Int16 - 상호 운용 및 기타 특수 용도
  • Int32 - 정수 및 카운터
  • Int64 - 큰 정수

Int16은 실제로 단어 액세스를 위한 x86 명령어가 dword 액세스를 위한 명령어보다 더 많은 공간을 차지하기 때문에 덜 효율적일 수 있습니다.그것은 JIT가 무엇을 하느냐에 따라 달라질 것입니다.그러나 어떤 일이 있어도 반복에서 변수로 사용하는 것이 더 효율적이지는 않습니다.

그 반대는 사실입니다.

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

Int16은 데이터 구조를 가능한 한 얇게 만들고 싶을 때 유용합니다.이렇게 하면 공간이 절약되고 성능이 향상될 수 있습니다.

최신 하드웨어에서는 성능 차이가 매우 작기 때문에 모든 면에서 아무런 차이가 없습니다.테스트 하네스를 몇 개 작성해 보고 두 개를 모두 수백 번 실행하면 평균 루프 완료 시간을 확인할 수 있습니다. 그러면 제가 의미하는 바를 알 수 있을 것입니다.

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

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

더 효율적인 것과 그렇지 않은 것은 컴파일러마다, 그리고 플랫폼마다 다를 것입니다.실제로 테스트하지 않는 한 int16이나 int가 더 효율적인지 알 수 없습니다.

int16 수정을 사용하는 검증된 성능 문제가 발생하지 않는 한, 저는 int를 고수할 것입니다.

가장 빠른 성능을 위해 32비트 시스템(또는 64비트 시스템)에서 Int32를 사용합니다.사용하는 공간이 걱정되는 경우에는 더 작은 정수 유형을 사용합니다(더 느릴 수도 있음).

다른 것들은 맞습니다. 32비트 코드의 경우 Int32보다 작은 값만 사용합니다.Int64(64비트 코드의 경우)는 스토리지 요구사항이 극단적이거나 비즈니스 객체 필드에 대한 다른 수준의 적용이 필요한 경우에 사용됩니다(물론 이 경우에도 여전히 적절한 수준의 검증이 필요합니다).

그리고 일반적으로 성능 문제가 발생할 때까지 효율성에 대해 걱정하지 마십시오.그런 경우에는 프로파일링을 하세요.그리고 프로파일링을 하는 동안 두 가지 방법으로 추측하고 확인하는 것이 충분히 도움이 되지 않는다면, IL 코드를 확인하십시오.

좋은 질문입니다.당신은 컴파일러가 어떻게 그것을 하는지에 대해 더 많이 배웁니다.보다 효율적으로 프로그래밍하는 방법을 배우고 싶다면 IL의 기본 사항과 C#/VB 컴파일러의 작업 방식을 배우는 것이 좋습니다.

Int16에 비해 성능이 크게 향상된 것은 상상할 수 없습니다.

변수 선언에 일부 비트를 저장합니다.

사양이 변경되고 계산하는 항목이 32767을 초과할 수 있으므로 애플리케이션에서 예외를 적용하기 시작하면 다음과 같은 이점을 얻을 수 있습니다.

Int32보다 작은 데이터 유형을 사용해도 성능이 크게 향상되지 않습니다. 실제로 메모리 할당 때문에 Int32를 사용하는 것이 Int16보다 빠를 것이라는 것을 어디선가 읽었습니다.

언급URL : https://stackoverflow.com/questions/129023/net-integer-vs-int16

반응형