He estado tratando de determinar cuál es el costo real de usar la instrucción fija dentro de C# para las estructuras inseguras administradas que contienen arreglos fijos. Tenga en cuenta que no me refiero a las estructuras no administradas.¿Cuál es la sobrecarga de la sentencia fija C# en una estructura administrada insegura que contiene arreglos fijos?
Específicamente, ¿hay alguna razón para evitar el patrón mostrado por la clase 'MultipleFixed' a continuación? ¿El costo de simplemente arreglar los datos es distinto de cero, cerca de cero (== costo similar a la configuración & despejando un solo indicador al entrar/salir del alcance fijo), o es lo suficientemente importante como para evitarlo cuando sea posible?
Obviamente, estas clases están diseñadas para ayudar a explicar la pregunta. Esto es para una estructura de datos de alto uso en un juego XNA donde el rendimiento de lectura/escritura de estos datos es crítico, así que si necesito arreglar el arreglo y pasarlo a todas partes lo haré, pero si no hay ninguna diferencia en absoluto Preferiría mantener el local fijo() en los métodos para ayudar a mantener las firmas de funciones ligeramente más portátiles a las plataformas que no admiten código inseguro. (Sí, es un poco de código extra ronco, pero lo que sea necesario ..)
unsafe struct ByteArray { public fixed byte Data[1024]; } class MultipleFixed { unsafe void SetValue(ref ByteArray bytes, int index, byte value) { fixed(byte* data = bytes.Data) { data[index] = value; } } unsafe bool Validate(ref ByteArray bytes, int index, byte expectedValue) { fixed(byte* data = bytes.Data) { return data[index] == expectedValue; } } void Test(ref ByteArray bytes) { SetValue(ref bytes, 0, 1); Validate(ref bytes, 0, 1); } } class SingleFixed { unsafe void SetValue(byte* data, int index, byte value) { data[index] = value; } unsafe bool Validate(byte* data, int index, byte expectedValue) { return data[index] == expectedValue; } unsafe void Test(ref ByteArray bytes) { fixed(byte* data = bytes.Data) { SetValue(data, 0, 1); Validate(data, 0, 1); } } }
Además, me buscó preguntas similares y el más cercano que encontré fue this, pero esta cuestión es diferente, ya que se refiere únicamente a pura código administrado y los costos específicos de uso fijo en ese contexto.
¡Gracias por cualquier información!
Gracias - buena información! Todavía me pregunto cuál es la razón subyacente de los gastos generales, pero obtener un buen rendimiento es el objetivo principal. –
Sí, voy a ceder ante Skeet, Lippart o Gravel por el "por qué". Pero si juegas con el tamaño de tu estructura, podría decirte si el tiempo de ejecución está haciendo una copia de la estructura '' corregida ". Creo que la operación de fijación copia toda la estructura. (Consulte también: http://www.dotnetperls.com/fixed-buffer) – ligos
Esta prueba no es precisa. Está utilizando fijo de una manera totalmente irrazonable. El uso correcto sería arreglar una vez, escribir muchas veces, deshacer. – JakeSays