Inquietudes sobre la memoria del boxeo [cerrado]

private double _value;


public object Value
{
    get
   {
         return _value;
   }

}

Estoy revisando el código y noté esto en nuestro código base. No es un error tipográfico, pero mi preocupación está con el boxeo. Eso está involucrado cuando se llama al getter, y dado que este código es de un tipo, que se genera cientos de veces y se llama al getter con frecuencia, puedo ver un problema con la memoria.

¿Son correctas mis preocupaciones con la memoria? Quiero decir, ¿nos estamos duplicando debido al boxeo?

preguntado el 10 de mayo de 11 a las 13:05

4 Respuestas

Sí, el fragmento de código que ha mostrado provocará boxeo. Estás forzando el tiempo de ejecución para convertir un double en una object. Si desea demostrárselo a usted mismo oa un colega, consulte el IL compilado para ver el indicador box y unbox instrucciones.

Sin embargo, si bien tiene razón al evitar el boxeo siempre que sea posible, la penalización real del rendimiento no siempre es tan significativa como lo hace parecer. Antes de realizar cambios importantes en su base de código, invierta algo de tiempo en la elaboración de perfiles para asegurarse de que el código en el que está dedicando su tiempo sea realmente un cuello de botella de rendimiento.

Dado el ejemplo específico anterior, no está particularmente claro por qué necesita devolver el tipo object en primer lugar. Dado que solo está devolviendo el valor de un campo privado, simplemente puede cambiar la propiedad para devolver el tipo double, en cambio.

Alternativamente, puede convertir la propiedad en un método genérico. (Las propiedades no pueden ser genéricas, pero los métodos sí, y si estás haciendo un trabajo computacionalmente intenso dentro del getter, probablemente debería ser un método de todos modos). Los genéricos alivian el problema del boxeo, pero aún te permiten un inmenso grado de flexibilidad en el tipo que se devuelve (similar al tipo de devolución object).

contestado el 10 de mayo de 11 a las 17:05

Sí, creará un nuevo objeto cada vez que llame al getter.

Sí, esto tomará memoria.

¿Sin embargo, es un problema? Solo tú puedes decirlo. Depende de la frecuencia con la que suceda y de si hay alguna alternativa mejor. ¿Hay alguna razón por la que para ser declarado para regresar object en lugar de double? ¿Se asignará a un object escriba la variable de todos modos (en cuyo caso, el boxeo ocurrirá independientemente)?

El boxeo es una de esas preocupaciones de rendimiento que es reales., pero a menudo exagerado. Si está sucediendo cientos de miles de veces por segundo en su aplicación, probablemente sea significativo. Si ocurre cientos de veces por hora, su preocupación debería ser más sobre si la API está adecuado que el costo de rendimiento.

Respondido 22 ago 16, 03:08

Es una aplicación en tiempo real, por lo que es más como cien veces por segundo. Andy

@Andy: Simplemente centenares de veces por segundo probablemente no sea significativo. ¡Pero pruébalo! - Jon Skeet

Tienes razón en estar un poco preocupado por esto, al menos es definitivamente un anti-patrón.

Sin embargo, en lugar de explicarlo aquí, este artículo es una muy buena lectura:

http://www.codeguru.com/csharp/csharp/cs_syntax/article.php/c5883

¡Espero que esto ayude!

contestado el 10 de mayo de 11 a las 17:05

La sobrecarga real es específica de la plataforma. El tamaño de Double está fijo en todas las plataformas, pero cuando el valor está en un cuadro, tendrá una referencia al objeto de tipo de tiempo de ejecución. El tamaño de la referencia es específico de la plataforma. Entonces, en total, el objeto será de 16 bytes en 32 bits y 24 bytes en 64 bits. Se creará un nuevo objeto para cada llamada. Si eso va a ser un problema, no puedo decirlo, pero lo dudo. Si tiene dudas perfílelo.

contestado el 10 de mayo de 11 a las 17:05

Llamo a Value, me devolverá un valor en caja (puntero). Si vuelvo a llamar a Value, ¿obtengo un nuevo puntero que apunta al mismo objeto o un nuevo objeto y un nuevo puntero? Andy

@Andy: Obtendrá un nuevo objeto para cada llamada. - Brian Rasmussen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.