IT이야기

바이트 대신 Enum Int32의 기본 유형을 만들어야 하는 이유

cyworld 2021. 9. 23. 22:42
반응형

바이트 대신 Enum Int32의 기본 유형을 만들어야 하는 이유는 무엇입니까?


다음 열거형이 주어지면:

public enum Operations_PerHourType : byte
{
    Holes = 1,
    Pieces = 2,
    Sheets = 3,
    Strips = 4,
    Studs = 5
}

Microsoft 코드 분석 도구를 실행하면 다음과 같이 알려줍니다.

CA1028 : Microsoft.Design : 가능한 경우 '바이트' 대신 'Enums.Operations_PerHourType' System.Int32의 기본 유형을 만드십시오.

가능한 두 개 이상의 값을 가질 수 없으므로 바이트로 선언했습니다. 왜 int32 사용을 권장합니까? 미래의 확장성을 위한 더 많은 가치? 아니면 성능 향상이 있습니까?


그 이유 MSDN살펴보십시오 .

다음은 발췌한 내용입니다.

열거형은 관련된 명명된 상수 집합을 정의하는 값 유형입니다. 기본적으로 System.Int32 데이터 형식은 상수 값을 저장하는 데 사용됩니다. 이 기본 유형을 변경할 수 있지만 대부분의 시나리오에서는 필요하지 않거나 권장되지 않습니다. Int32보다 작은 데이터 형식을 사용하면 성능이 크게 향상되지 않습니다. 기본 데이터 형식을 사용할 수 없는 경우 CLS(공용 언어 시스템) 호환 정수 형식 중 하나를 사용해야 합니다. 프로그래밍 언어들.


기본 형식을 좁히는 것이 몇 가지 이점을 가져오는 특정 상황이 있습니다. 예를 들어 비관리 코드에 인터페이스할 때 특정 메모리 레이아웃을 강제 실행하거나 성능과 관련이 있습니다.

다음 샘플을 고려하십시오.

using System;

public enum Operations_PerHourType //   : byte
{
    Holes = 1,
    Pieces = 2,
    Sheets = 3,
    Strips = 4,
    Studs = 5
}

class Program
{
    static void Main()
    {
        long before = GC.GetTotalMemory(false);
        var enums = new Operations_PerHourType[10000];
        long after = GC.GetTotalMemory(false);

        Console.WriteLine(after - before);
        // output  (byte): 12218 (I'm using Mono 2.8)
        // output (Int32): 40960
    }
}

This code consumes roughly 40 KB of the heap. Now specify (uncomment) the underlying type as byte and recompile. Wow. Suddenly we only need roughly 10 KB.

Compacting memory like this may sometimes make a program slower, not faster, depending on particular access patterns and data sizes. There is no way to know for sure than to make some measurements and attempt to generalize to other possible circumstances. Sequential traversal of smaller data is usually faster.

However, developing a habit of specifying narrow types just because it is usually possible and sometimes crucial, is not a good idea. Memory savings rarely materialize due to memory alignment of surrounding wider data types. Performance is then either the same or slightly worse due to additional instructions needed to mask away padding bytes.

As another answer has already put it well, follow the Int32 crowd that the runtime is optimized for, until you have to start profiling and addressing real memory hogs in your application.


According to the documentation, there is no performance gain from using a byte instead of INT32. Unless there is a reason to do so, they recommend not changing it. The underlying idea, is that .NET is optimized for using INT32 in many scenarios, and they selected that for enums for a reason. You don't get anything in your scenario by changing it, so why bother.

http://msdn.microsoft.com/en-us/library/ms182147.aspx

This also talks about how .NET is optimized to use 32 bit integers: .NET Optimized Int32

ReferenceURL : https://stackoverflow.com/questions/10216910/why-should-i-make-the-underlying-type-of-an-enum-int32-instead-of-byte

반응형