2012-03-29 20 views
6

Estoy programando un juego usando C#, por lo tanto, estoy muy preocupado por el rendimiento.Clase VS ref. Estructura

Me gustaría saber cuáles son las principales diferencias, y si es posible, las consideraciones de rendimiento de utilizar una clase para pasar datos, o una estructura pasada por referencia.

No deseo copiar los datos, por razones de rendimiento (supongo que pasar por ref es mucho más rápido que por su valor aquí).

Sé que una clase se pasa siempre por referencia y que una estructura se pasa por valor, pero estoy hablando de pasar la estructura por referencia aquí.

Un ejemplo de los datos que deseo pasar:

public delegate void PathCompleteDelegate(List<PathFinderNode> path); 
public struct PathFinderJob{ 
    public PathCompleteDelegate callback; 
    public Vector3 start, end; 
    public PathSize unitSize; 
    public BoxCollider boxCollider; 
} 

En el ejemplo anterior, sería el uso de una clase a hacer la diferencia? Si es así, ¿cuál sería la diferencia? ¿Sería una clase más rápida que una estructura en este ejemplo? ¿Por qué?

Gracias. Joao Carlos

+1

¿Has probado los perfiles de rendimiento de ambos enfoques? Si la estructura tiene un alcance fuera de un método, estará en el montón de todos modos (como en, dentro de una clase en el montón). Sospecho que la clase o la estructura tienen el mismo rendimiento en términos de llamadas a métodos. –

+0

No tengo mucha experiencia en la creación de perfiles, e hice un rápido análisis de perfiles usando el generador de perfiles integrado de Unity3D, pero no vi la diferencia, sin embargo, no sé qué tan bueno es el generador de perfiles integrado con este tipo de "peces pequeños" , o si vería una diferencia en absoluto entre todos los demás perfiles relacionados con el juego. –

+0

No desperdiciaría mi tiempo en estructuras mientras programaba un juego en un idioma OO. El problema que ** I ** enfrentaría antes de tener problemas de rendimiento es ** no terminar ** el juego. Las clases y los objetos aumentan la velocidad de desarrollo IMO. – Bitterblue

Respuesta

4

Su delegado recibe un tipo de referencia - a List, por lo que está pasando toda la lista por referencia de todos modos.

Pasar una estructura grande por valor es definitivamente más caro que pasar solo la referencia. Cuando tienes una estructura grande, generalmente no tiene sentido usarla como estructura, solo conviértela en una clase.

De todas formas, ¿tienes seguro, tendrás un problema de rendimiento aquí? Parece una optimización muy prematura.

+0

Estoy programando el juego y aprendiendo cómo escribir código más rápido. Ese paso exacto no es un gran problema, porque a lo sumo, no habrá más de 1000 solicitudes de ruta de acceso por segundo (supongo). Pero en la estructura del nodo Pathfinders, esto podría escalar hasta 100 nodos * 1000pathFindingRequests, y aprender sobre esto probablemente ayude allí. –

+0

Desreferencia de 100 nodos 1000 veces, es decir, 100.000 desreferencias, un segundo no debería plantear ningún tipo de problema. – zmbq

+0

Y si resulta que su juego es rezagado, el perfilado probablemente revelaría una sola línea de código que es responsable. Las computadoras actualmente son muy rápidas. – fabspro

7

sé que una clase siempre se pasa por referencia y que es una estructura pasa por valor, pero hablando de pasar la estructura por referencia aquí.

Probablemente tenga la idea correcta, pero esto es incorrecto. Todo en C# se pasa por valor a menos que use la palabra clave ref.

Las instancias de clase son tipos de referencia, las instancias de estructura son tipos de valores.

Cuando pasa un tipo de referencia por valor, pasa una copia de la referencia (pequeña). Cuando pasa un tipo de valor por valor, pasa una copia de los datos completos (potencialmente grandes).

Jon Skeet tiene una buena explicación de todo esto here.