.NET 정수 대 Int16?
저는 의심스러운 코딩 연습이 있습니다.
카운트 제한 미만인 소수의 항목 목록을 반복해야 하는 경우32000
사용합니다Int16
대신에 내 i 변수 유형에 대해.Integer
제가 이것을 하는 이유는 제가 사용하는 것을 가정하기 때문입니다.Int16
풀 블로우보다 효율적입니다.Integer
.
내가 틀렸나요?사용하는 것 사이에 효과적인 성능 차이가 있습니까?Int16
vsanInteger
사용을 중지해야 합니까?Int16
그리고 그냥 계속.Integer
내가 필요로 하는 모든 것들을 위해?
거의 항상 사용해야 합니다.Int32
또는Int64
(그리고 아니요, 당신은 사용함으로써 신용을 얻지 못합니다.UInt32
또는UInt64
때 배열 또는 컬렉션을 인덱스별로 루프할 때 사용합니다.
가장 배열 및 인덱스가 BCL에서 사용되기 입니다.Int32
s, 그래서 암묵적인 캐스팅은 항상 사용하려고 하는 코드에서 발생할 것입니다.Int16
색인으로서
명확하지 않은 이유(및 어레이에 필요한 이유)Int32
index)는 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
'programing' 카테고리의 다른 글
방법은 정적으로 만들 수 있지만, 그래야 합니까? (0) | 2023.05.21 |
---|---|
JavaScript의 Zip 배열? (0) | 2023.05.16 |
Bash에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법 (0) | 2023.05.16 |
가변 길이 어레이가 C++ 표준의 일부가 아닌 이유는 무엇입니까? (0) | 2023.05.16 |
Windows에서 Git:병합 도구는 어떻게 설정합니까? (0) | 2023.05.16 |