2

値型をメソッドに渡す必要があるが、何らかの理由で参照型として渡す必要がある場合は、次のほうが高速ですか?

  1. として渡すobject
  2. パスはValueType
  3. 汎用ラッパーとして渡す

私が何を意味するかを正確に示すために、以下にいくつかのサンプルコードを示します。

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; }
    }
}
4

2 に答える 2

4

最初の 2 つは実際には同等であり、標準のboxIL を生成するだけです。3 つ目は、ラッパー クラスの構築を必要とし、ボックス コールよりもコストがかかる可能性があります。

于 2011-05-13T02:33:40.227 に答える
1

最終的に値型は参照型で表される必要があるため、パフォーマンスはおそらく3つすべてで同等です。つまり、ある時点でボクシングを意味します。しかし、不必要なオーバーヘッドとラッピングで事態を悪化させる可能性があります。

ボクシングについて理解する重要なことは、それが本質的に高価ではなく、タイトなループでのボクシングとアンボクシングのような特定のコンテキストでのみ比較的高価であるということです。値型自体を使用できない理由と、参照型を使用する必要がある理由に焦点を当てて、それが設計の指針となるようにしてください。参照型から値型にどのようにアクセスしますか。参照型は他の参照型を保持しますか?等々。

何よりも、本当に心配な場合は、コード化して測定するだけです。また、パフォーマンスが重要であり、アプリケーションが進化する場合は、アプリケーションのコンテキストで測定を続けます。

于 2011-05-13T02:41:23.670 に答える