Question

J'ai un projet où je veux avoir vérifié l'arithmétique par défaut, sauf pour un point sensible de la performance. Malheureusement, VB.Net ne dispose pas d'un bloc « sans contrôle ».

Idéalement, le cadre aurait une sorte de type entier avec l'arithmétique explicitement sans contrôle, mais je ne trouve pas quelque chose comme ça. J'ai trouvé que les arbres d'expression ont des expressions binaires pour les opérations non vérifiées, mais les frais généraux délégué annule l'avantage sans contrôle (et puis certains).

Actuellement, je suis convertir les entrées UInt64 / Int64 avant de faire l'arithmétique, puis reconvertir (avec Bitwise Et pour assurer à portée). Il est environ 50% plus lente que arithmétique non contrôlée (selon le profilage).

Déplacement de la partie arithmétique sensible à un projet avec l'arithmétique non contrôlée pourrait fonctionner, mais il semble exagéré de donner un ensemble tout à lui-même.

Était-ce utile?

La solution

Personnellement, je pense que cela dans quittais sa propre assemblée, d'autant plus que ce sera un petit assemblage, est une bonne option. Cela facilite l'entretien, car il est facile de régénérer cette assemblée à tout moment. Il suffit de faire un ensemble séparé marqué sans contrôle, et de mettre votre code de performance sensible là.

Autres conseils

Je sais que c'est vieux, mais j'ai récemment besoin de convertir un code C # utilisé sans contrôle et je pensais que je partagerais comment je l'ai fait. Il est pur code VB et étendue peut être limitée mais vous avez besoin (plutôt que d'une option de projet à l'échelle).

L'astuce consiste à créer une structure qui contient un champ long et deux champs entiers. Ensuite, utilisez StructLayout et FieldOffset attributs pour créer une union de long et les deux entiers. Les champs peuvent (doivent) être privé. Utiliser l'élargissement des opérateurs Ctype pour convertir à partir d'une longue à la structure et de la structure à un nombre entier (à l'aide de la faible valeur de nombre entier). Ajouter opérateur pour les surcharges +, -, *, etc ... et hop! arithmétique non contrôlée dans VB!

sorte ... il débordera encore, comme Strilanc a souligné, si la valeur longue passe en dehors de la plage de positions longues. Mais cela fonctionne assez bien pour beaucoup de situations où décochée est utilisé.

Voici un exemple:

<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

Utilisez la structure dans le code comme ceci:

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

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

Attention que vos calculs ne débordent pas avant d'affecter le résultat à un UncheckedInteger. Vous pouvez créer des structures UncheckedShort et UncheckedByte en utilisant la même technique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top