2

値を計算して UInt32 を返す高速なビットレベル ルーチンがあります。この値を SQL Server の 32 ビット int フィールドに格納する必要があります。フィールドのサイズを大きくしたくありません。この関数からの「バイト」を int フィールドに格納したいだけです。

一度に数百のこれらのレコードが要求されるため、ループ内で UInt32 を int に変換する最速の方法が必要です。左端のビットが UInt32 に設定されている場合は、int の符号ビットを設定する必要があります (または、実際には「反復可能な」ことを行いますが、符号ビットがおそらく最も簡単です)。

つまり、UInt32 の 4 バイトを 32 ビット int の 4 バイトにしたいだけです。BitConverter クラスを使用できますが、それが最速の方法かどうかはわかりません。次のような未チェックの領域でこれを行う方が速いでしょうか。

UInt32 fld = 4292515959;
unchecked {
    return (int)fld;
    // -2451337
}

ここで逆の質問がされているのを見て、答えが同じになるかどうか疑問に思っていました。

intをUInt32ビットごとにキャストする最速の方法は?

4

2 に答える 2

3

unchecked((int)x)メソッド呼び出しがないため、チェックされていないバージョン( など)が最速の方法だと思います。もっと速い方法はないと思います。

ちなみに、UInt32は…の別名でuint、一方通行と他方行は性能的に同じなので、リンク先のとおりです。


編集: よりも高速なベンチマークのインスタンスを直接観察したことを覚えています(checkedいいえuncheckedデバッグ ビルドではなく、最適化されたリリース ビルドでした)。なぜそうなったのかはわかりませんが、いずれにせよ、オーバーフロー チェックをオフにすることで、測定できるほどの利益が得られるとは思わないでください。

于 2011-01-02T03:10:30.593 に答える
1

unchecked((int)x)const のキャストのみが必要であり、checked と unchecked は同じ結果を生成します (コードがコンパイルできる場合)。

たとえば、このコード

uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
    uncheckedData = (int)data;
}
checkedData = (int)data;

Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);

この出力を生成します

4292515959
-2451337
-2451337

より簡潔にするために、このコードをコンパイルできます ( と同じ結果unchecked((int)data))

uint data = 4292515959;
checkedData = (int)data;

このコード (const に注意) はコンパイルできません (未チェックが必要です)

const uint data = 4292515959;
checkedData = (int)data;

このコードもコンパイルできません (未チェックが必要です)

checkedData = (int)4292515959;
于 2019-03-20T07:36:15.450 に答える