Come ottenere le migliori prestazioni quando si supera un tipo di valore come tipo di riferimento nella rete C#/.?
-
12-11-2019 - |
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:
- Passalo come un
object
- Pass è come a
ValueType
- 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; }
}
}
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.