Frage

Ich habe ein Projekt, wo ich will Arithmetik standardmäßig überprüft, bis auf eine Leistung empfindlichste Stelle. Leider hat VB.Net keinen ‚ungeprüft‘ Block hat.

Im Idealfall würde der Rahmen eine Art von Integer-Typ hat mit explizit ungeprüft Arithmetik, aber ich habe nichts dergleichen finden. Ich habe gefunden, dass die Expression Bäume binären Ausdrücke für unkontrollierte Operationen, aber die Delegierten Kopf aufhebt den ungeprüften Vorteil (und dann einig).

Zur Zeit bin ich Umwandlung der Eingänge zu UInt64 / Int64 vor der Arithmetik zu tun, dann Umwandlung zurück (mit einem bitweise Und in-Bereich zu gewährleisten). Es ist etwa 50% langsamer als unkontrollierte Arithmetik (nach Profilierung).

Das Verschieben der Arithmetik empfindlichen Teil zu einem Projekt mit ungeprüften Arithmetik könnte funktionieren, aber es scheint übertrieben es eine Anordnung, alle für sich selbst zu geben.

War es hilfreich?

Lösung

Ich persönlich denke, verlassen diese in seiner eigenen Montag, zumal es so eine kleine Versammlung sein wird, ist eine gute Wahl. Dies erleichtert die Wartung, da es einfach, diese Montage jederzeit zu regenerieren. So stellen Sie eine separate Baugruppe markiert nicht markiert, und stellen Sie Ihre Leistung empfindlichen Code gibt.

Andere Tipps

Ich weiß, das ist alt, aber ich vor kurzem einige C # -Code zu konvertieren benötigt, die nicht markiert verwendet, und ich dachte, ich würde teilen, wie ich es tat. Es ist reiner Code VB und kann jedoch scoped werden Sie brauchen (statt einer projektweiten Option).

Der Trick ist, eine Struktur zu schaffen, die ein langes Feld und zwei Integer-Felder enthält. Dann nutzen Sie StructLayout und FieldOffset Attribute eine Vereinigung der langen und zwei ganzen Zahlen zu erstellen. Die Felder können (sollten) privat sein. Verwenden erweiternden CType Operatoren aus einem Lang die Struktur umzuwandeln, und aus der Struktur auf eine ganze Zahl (den niedrigen ganzzahligen Wert verwendet wird). Hinzufügen Betreiber Überlastungen für +, -, *, etc ... und presto! ungehemmt Arithmetik in VB!

Sortieren von ... es wird immer noch Überlauf, wie Strilanc wies darauf hin, wenn der lange Wert für Long-Positionen außerhalb des Bereichs geht. Aber es funktioniert ziemlich gut für eine Vielzahl von Situationen, in denen unkontrolliert verwendet wird.

Hier ist ein Beispiel:

<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

Mit der Struktur in Code wie folgt:

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

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

Sie vorsichtig, dass Ihre Berechnungen Überlauf nicht, bevor das Ergebnis zu einem UncheckedInteger zuweisen. Sie könnten UncheckedShort und UncheckedByte Strukturen mit der gleichen Technik erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top