Come ottenere le migliori prestazioni quando si supera un tipo di valore come tipo di riferimento nella rete C#/.?

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

Domanda

Se è necessario passare un tipo di valore a un metodo, ma per qualche motivo, deve essere passato come tipo di riferimento, è più veloce a:

  1. Passalo come un object
  2. Pass è come a ValueType
  3. Passalo come un involucro generico

Di seguito ho messo un codice di esempio per dimostrare esattamente cosa intendo:.

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; }
    }
}
È stato utile?

Soluzione

I primi due sono effettivamente equivalenti e generano semplicemente lo standard box I L. Il terzo richiede la costruzione della classe Wrapper, che è probabilmente più costosa della chiamata a scatola.

Altri suggerimenti

Le prestazioni sono probabilmente comparabili per tutti e tre poiché alla fine un tipo di valore deve essere rappresentato in un tipo di riferimento che significa boxe ad un certo punto. Ma puoi peggiorare le cose con inutili spese generali e avvolgimenti.

La cosa importante da realizzare sulla boxe è che non è intrinsecamente costoso, è solo relativamente costoso nel contesto di qualcosa di specifico come la boxe e unboxing in un ciclo stretto. Prova a concentrarti sul perché non è possibile utilizzare il tipo di valore stesso e perché è necessario utilizzare un tipo di riferimento e lasciare che la guida del tuo design. Come vorresti accedere al tipo di valore dal tipo di riferimento. Il tipo di riferimento manterrà altri tipi di riferimento? E così via.

Soprattutto, se sei davvero preoccupato, basta codificarlo e misuralo. E continua a misurarlo nel contesto dell'applicazione, se è critica delle prestazioni e l'applicazione si evolve.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top