質問

私は、私は1つの性能に敏感なスポットを除き、デフォルトで算術をチェックしたいプロジェクトを持っています。残念ながら、VB.Netは、「未チェック」のブロックを持っていません。

理想的なフレームワークは、明示的に未チェックの算術と整数型のいくつかの並べ替えを持っているだろうが、私はそのようなものを見つけることができませんでした。私は式ツリーは未チェックの操作のためのバイナリ表現を持っていますが、デリゲートのオーバーヘッドが(その後、いくつかをして)未チェックの利点を相殺することがわかりました。

現在、私はその後、(ビット単位とIn-範囲を確認するために)戻って変換し、算術演算を実行する前にUInt64型/ Int64型への入力を変換しています。これは、(プロファイルに従って)未チェックの演算よりも約50%遅いです。

働くかもしれない未確認の算術を使用したプロジェクトへの演算に敏感な部分を移動するが、自分自身にそれを組み立てすべてを与えるためにやり過ぎのように思える。

役に立ちましたか?

解決

個人的に、私はそれがこのような小さなアセンブリになるだろう、特に以来、優れた選択肢である、独自のアセンブリでこれを残すことだと思います。それはいつでも、このアセンブリを再生成するのは簡単ですので、これは、メンテナンスが容易になります。ただ、未確認のフラグが立てられ、別のアセンブリを作成し、そこに自分のパフォーマンスに敏感なコードを入れます。

他のヒント

私は、これは古いですけど、私は最近、未チェック使用されるいくつかのC#コードを変換するために必要と私は私がそれをやった方法を共有したいと思いました。これは、純粋なVBのコードだと、あなたは(というプロジェクト全体のオプションよりも)必要がスコープすることができます。

トリックロングフィールドと2つの整数フィールドを含む構造体を作成することです。その後StructLayoutとFieldOffsetが長いの労働組合と2つの整数を作成するために属性を使用しています。フィールドはプライベートに(必要がある)ことができます。構造および構造から(低い整数値を使用して)整数にロングから変換するために拡大のctype演算子を使用します。以下のためのオペレータのオーバーロードを追加+、 - 、*、等...とプレスト! VBに未チェックの算術!

並び替えの...それはオーバーフローまだ意志、長い値はlong型のための範囲外になった場合Strilancは、指摘したように。しかし、それが使用されている未確認の状況の多くのためにかなりうまく動作します。

ここでは一例です。

<StructLayout(LayoutKind.Explicit)>
Public Structure UncheckedInteger

    <FieldOffset(0)>
    Private longValue As Long
    <FieldOffset(0)>
    Private intValueLo As Integer
    <FieldOffset(4)>
    Private intValueHi As Integer

    Private Sub New(newLongValue As Long)
        longValue = newLongValue
    End Sub

    Public Overloads Shared Widening Operator CType(value As Long) As UncheckedInteger
        Return New UncheckedInteger(value)
    End Operator

    Public Overloads Shared Widening Operator CType(value As UncheckedInteger) As Long
        Return value.longValue
    End Operator

    Public Overloads Shared Widening Operator CType(value As UncheckedInteger) As Integer
        Return value.intValueLo
    End Operator

    Public Overloads Shared Operator *(x As UncheckedInteger, y As Integer) As UncheckedInteger
        Return New UncheckedInteger(x.longValue * y)
    End Operator

    Public Overloads Shared Operator Xor(x As UncheckedInteger, y As Integer) As UncheckedInteger
        Return New UncheckedInteger(x.longValue Xor y)
    End Operator

    ' Any other operator overload you need...
End Structure

このようなコード構造を使用します:

Dim x As UncheckedInteger = 2147483647
Dim result As Integer = x * 2  ' This would throw OverflowException using just Integers

Console.WriteLine(result.ToString())  ' -2

あなたの計算がUncheckedIntegerに結果を割り当てる前に、オーバーフローしないように注意してください。あなたは、同じ技術を使用してUncheckedShortとUncheckedByte構造を作成することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top