Comment obtenir les meilleures performances lors du passage d’un type valeur comme type de référence en C#/.NET ?

StackOverflow https://stackoverflow.com/questions/5986647

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 :

  1. Passez-le comme un object
  2. Le laissez-passer est comme un ValueType
  3. 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; }
    }
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top