Comment obtenir les meilleures performances lors du passage d’un type valeur comme type de référence en C#/.NET ?
-
12-11-2019 - |
Question
Si vous devez transmettre un type valeur à une méthode, mais que pour une raison quelconque, il doit être transmis comme type référence, est-il plus rapide de :
- Passez-le comme un
object
- Le laissez-passer est comme un
ValueType
- Passez-le comme wrapper générique
Je mets un exemple de code ci-dessous pour démontrer exactement ce que je veux dire :.
public class Program
{
public void Main()
{
var client = new IncrementedValueGetter();
int i = 8675309;
var byObject = client.IncrementObject(i);
var byValueType = client.IncrementValueType(i);
var byWrapper = client.IncrementWrapped(new ValueWrapper<int>(i));
}
}
public class IncrementedValueGetter
{
public int IncrementObject(object boxedValue)
{
return ((int)boxedValue) + 1;
}
public int IncrementValueType(ValueType boxedValueType)
{
return ((int) boxedValueType) + 1;
}
public int IncrementWrapped(ValueWrapper<int> valueWrapper)
{
return valueWrapper.Value + 1;
}
}
public class ValueWrapper<T>
where T: struct
{
private readonly T _value;
public ValueWrapper(T value)
{
_value = value;
}
public T Value
{
get { return _value; }
}
}
La solution
Les deux premiers sont en fait équivalents et génèrent simplement le standard box
IL.La troisième nécessite la construction de votre classe wrapper, ce qui est probablement plus coûteux que l'appel box.
Autres conseils
Les performances sont probablement comparables pour les trois puisqu'en fin de compte, un type valeur doit être représenté dans un type référence, ce qui signifie une boxe à un moment donné.Mais vous pouvez aggraver les choses avec des frais généraux et des emballages inutiles.
La chose importante à comprendre à propos de la boxe est qu’elle n’est pas chère en soi, elle n’est que relativement chère dans le contexte de quelque chose de spécifique comme la boxe et le déballage en boucle serrée.Essayez de vous concentrer sur les raisons pour lesquelles vous ne pouvez pas utiliser le type valeur lui-même et pourquoi vous devez utiliser un type référence et laissez-le guider votre conception.Comment souhaitez-vous accéder au type valeur à partir du type référence.Le type de référence contiendra-t-il d’autres types de référence ?Et ainsi de suite.
Surtout, si vous êtes vraiment inquiet, codez-le et mesurez-le.Et continuez à le mesurer dans le contexte de votre application, si cela est critique en termes de performances et si votre application évolue.