負の値をチェックするのではなく、uintにキャストして範囲チェックを行う方が効率的ですか?
質問
私は偶然、.NETの リスト ソース コード :
// Following trick can reduce the range check by one
if ((uint) index >= (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException();
}
よりも効率的(?)らしい。
if (index < 0 || index >= _size)
このトリックの根拠が気になるところです。1 回の分岐命令は、2 回の
uint
? あるいは、追加の数値比較よりもこのコードを高速化する他の最適化が行われているのでしょうか?
部屋の中の象に対処するために: はい、これはマイクロ最適化です、いいえ、私は私のコードでこれをどこでも使用するつもりはありません - 私はちょうど好奇心です;)
どのように解決するのですか?
から MSパーティションI の 12.1 節 (サポートされるデータ型) を参照してください。
符号付き整数型(int8、int16、int32、int64、ネイティブint)および対応する符号なし整数型(unsigned int8、unsigned int16、unsigned int32、native unsigned int64)。 整数型(int8、int16、int32、int64、ネイティブint)と、それに対応する符号なし整数型(符号なしint8、符号なしint16、符号なしint32、符号なしint64、ネイティブunsigned int)とでは,整数のビットの解釈の仕方が異なるだけである。符号なし整数が符号あり整数と異なる扱いを受ける演算では 符号なし整数が符号あり整数と異なる扱いを受ける場合(例えば,比較やオーバーフローを伴う演算など)には,整数を符号なし整数として扱う別の命令が用意されています。 整数を符号なしとして扱うための個別の命令があります(たとえば、cgt.un と add.ovf.un)。
つまり
変換
から
int
から
uint
は単に帳簿上の問題であり、今後、スタックやレジスタにある値は int ではなく unsigned int であることが知られています。
したがって、コードが JIT されると、2 つの変換は "free"になり、その後符号なし比較演算が実行されるようになるはずです。
関連
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み】Javaで(a != 0 && b != 0)よりも(a*b != 0)の方が速いのはなぜか?
-
[解決済み】numpy:配列内のユニークな値に対する最も効率的な頻度カウント
-
[解決済み】連続したintに対するJavaのswitchは、ケースを追加することでより速く実行されるように見えるのはなぜですか?
-
[解決済み] jQuery hasClass() - 複数のクラスがあるかどうかをチェックする
-
[解決済み] C#で負にできない値にはuintを使うべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] uintとintの使い分け [クローズド]。