Pregunta

Tengo un proyecto donde quiero haber comprobado la aritmética de forma predeterminada, a excepción de un punto sensible rendimiento. Por desgracia, VB.Net no tiene un bloque 'sin control'.

Lo ideal sería que el marco podría tener algún tipo de tipo entero con la aritmética de manera explícita sin marcar, pero no encontré nada por el estilo. Lo que encontrar los árboles de expresión que tienen expresiones binarias para las operaciones sin marcar, pero la sobrecarga delegado anula la ventaja sin marcar (y algo más).

Actualmente estoy convirtiendo las entradas a UInt64 / Int64 antes de hacer la aritmética, a continuación, la conversión de la espalda (con un nivel de bits y para asegurar dentro de alcance). Es aproximadamente un 50% más lenta que la aritmética sin marcar (de acuerdo con los perfiles).

Al mover la parte aritmética sensible a un proyecto con la aritmética sin control podría funcionar, pero parece una exageración para darle una asamblea para ella sola.

¿Fue útil?

Solución

En lo personal, creo que dejo esto en su propia asamblea, sobre todo porque va a ser un pequeño conjunto de este tipo, es una buena opción. Esto hace que el mantenimiento más fácil, ya que es fácil de regenerar este montaje en cualquier momento. Acaba de hacer un montaje separado marcado sin control, y poner el código sensibles al rendimiento allí.

Otros consejos

Sé que esto es viejo, pero hace poco que necesitaba para convertir algo de código C # que utiliza sin control y yo pensé en compartir cómo lo hice. Es puro código VB y puede estar al alcance sin embargo es necesario (en lugar de una opción para todo el proyecto).

El truco es crear una estructura que contiene dos campos enteros de un campo largo y. A continuación, utilice StructLayout y FieldOffset atributos para crear una unión de la larga y los dos números enteros. Los campos pueden (deben) ser privado. Utilice ensanchamiento operadores CType convertir de un largo a la estructura y de la estructura a un entero (usando el bajo valor entero). Añadir sobrecargas de operadores de +, -, *, etc ... y listo! aritmética sin comprobar en VB!

Una especie de ... éste seguirá desbordamiento, como Strilanc señaló, si el valor de largo se sale del rango de largos. Pero funciona bastante bien para una gran cantidad de situaciones en las que se utiliza sin control.

Este es un ejemplo:

<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

Utilice la estructura de código como el siguiente:

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

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

cuidado de que sus cálculos no lo hacen desbordamiento antes de asignar el resultado a un UncheckedInteger. Se puede crear estructuras UncheckedShort y UncheckedByte utilizando la misma técnica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top