56

次の列挙型が与えられます:

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

Microsoftコード分析ツールを実行すると、次のように表示されます。

CA1028:Microsoft.Design:可能であれば、基になるタイプを「byte」ではなく「Enums.Operations_PerHourType」System.Int32にします。

可能な値が2つを超えることはないので、バイトとして宣言しました。なぜ彼らはint32の使用を推奨するのでしょうか?将来のスケーラビリティのためのより多くの値?または、パフォーマンスの向上はありますか?

4

3 に答える 3

40

その理由については、MSDNをご覧ください。

抜粋は次のとおりです。

列挙型は、関連する名前付き定数のセットを定義する値型です。デフォルトでは、System.Int32データ型が定数値を格納するために使用されます。この基になるタイプは変更できますが、ほとんどのシナリオでは必要または推奨されません。Int32よりも小さいデータ型を使用しても、パフォーマンスが大幅に向上することはありません。デフォルトのデータ型を使用できない場合は、Common Language System(CLS)準拠の整数型、Byte、Int16、Int32、またはInt64のいずれかを使用して、列挙型のすべての値をCLS準拠で表現できるようにする必要があります。プログラミング言語。

于 2012-04-18T19:52:59.270 に答える
27

基になるタイプを絞り込むと、パフォーマンスに関連する、またはアンマネージコードにインターフェイスするときに特定のメモリレイアウトを強制するなど、いくつかの利点がもたらされる特定の状況があります。

このサンプルを検討してください。

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
    }
}

このコードは、ヒープの約40KBを消費します。次に、基になるタイプをとして指定(コメント解除)してbyte、再コンパイルします。わお。突然、必要なのは約10KBだけです。

このようにメモリを圧縮すると、特定のアクセスパターンとデータサイズによっては、プログラムが遅くなる場合がありますが、速くなることはありません。いくつかの測定を行い、他の考えられる状況に一般化しようとする以外に、確実に知る方法はありません。通常、小さいデータのシーケンシャルトラバーサルは高速です。

ただし、通常は可能であり、場合によっては重要であるという理由だけで、狭いタイプを指定する習慣を身に付けることはお勧めできません。周囲のより広いデータ型のメモリアライメントのため、メモリの節約が実現することはめったにありません。その場合、パディングバイトをマスクするために必要な追加の命令のために、パフォーマンスは同じかわずかに悪化します。

別の答えがすでにうまくいっているのでInt32、アプリケーションで実際のメモリの占有のプロファイリングと対処を開始する必要があるまで、ランタイムが最適化されている群衆に従ってください。

于 2012-04-18T21:23:03.693 に答える
21

ドキュメントによると、INT32の代わりにバイトを使用してもパフォーマンスは向上しません。理由がない限り、変更しないことをお勧めします。基本的な考え方は、.NETは多くのシナリオでINT32を使用するように最適化されており、理由から列挙型としてINT32を選択したというものです。シナリオを変更しても何も得られないので、わざわざする必要があります。

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

これは、.NETが32ビット整数を使用するように最適化される方法についても説明しています。.NETOptimized Int32

于 2012-04-18T19:53:06.587 に答える