質問

パラメータ C# い性能を意味しいですか?などを除く)

だって、それは良いでもらいたいとの想いから、メソッド out パラメーターループを実行するカップルでの万回。

この醜いものを使用していなと同じように Int32.TryParse を利用している-返す bool だかの検証が成功したと out パラメータを含む追加データの場合に成功しました。

役に立ちましたか?

解決

私は間違いを見つけることができます他の顕著なパフォーマンスのジャーナルは利用 out パラメータとします。まっ情報を呼び出し側が、何とかその他 out だがもちろん、のはそれができていました。いであ 一部の 刑制度をご利用の場合、outパラメータを幅広くメソッド内のすところは、もう追加的レベルのリダイレクトされます。しか期待できます。通常、最も読みやコード 試験るかどうかのパフォーマンスを十分 前しよう最適化さい。

編集:これはさておきます。でも関連する大型の値型は、通常は回避できるか:)

私は国立大学志望の浪人生でKonradの主張"についての戻り値タ>32ビットの扱いの類似または同一に引数のレベルにとにかく"になってる。ここでちょっと試験アプリ

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;

struct BigStruct
{
    public Guid guid1, guid2, guid3, guid4;
    public decimal dec1, dec2, dec3, dec4;
}

class Test
{
    const int Iterations = 100000000;

    static void Main()
    {
        decimal total = 0m;
        // JIT first
        ReturnValue();
        BigStruct tmp;
        OutParameter(out tmp);

        Stopwatch sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            BigStruct bs = ReturnValue();
            total += bs.dec1;
        }
        sw.Stop();
        Console.WriteLine("Using return value: {0}",
                          sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            BigStruct bs;
            OutParameter(out bs);
            total += bs.dec1;
        }
        Console.WriteLine("Using out parameter: {0}",
                          sw.ElapsedMilliseconds);
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static BigStruct ReturnValue()
    {
        return new BigStruct();
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void OutParameter(out BigStruct x)
    {
        x = new BigStruct();
    }
}

結果:

Using return value: 11316
Using out parameter: 7461

基本的には使用出力パラメータまたデータを書き込むに直接、最終目的地ではなく書面でのメソッドのスタックフレームをコピーして、本メソッドのスタックフレーム。

お気軽に批判のベンチマークアプリがいっすね!

他のヒント

なパフォーマンスの問題だったような状況をどのように取り扱う 使用できなくなって分散クライアントまで、フルのC#4.0.

個人的にはを使うの out パラメータを引っ 民間 コード(内部クラスは、する方法を返します複数の値を使用せずに個別型)-でもないし、公開APIを除き、 bool Try{Something}(out result) パターンです。

ありません績に影響を与えるおそれの out 基本的には同じでもない、最近、よく引数を渡すから、技術的ます。のではな音が発生し易いる巨大なamoundsのデータがコピーされる例大型構造体が、これは実際と同じ戻り値です。

実際、戻り値はすべてのタ>32ビットの扱いと同様 out 引数の 機レベル ます。

ごとの最終決しないことを返す値== out パラメータです。います。ジョンのベンチマークすることが明らかに(残念ながら)ではありません。このため、同じ 名戻り値最適化 採用のC++コンパイラでコンパイル.うる可能性さらには将来のバージョンのJITの性能向上のための帰国の大型構造物(但し、大型構造物は目の前には浮間公園という大きな.純、これは不必要な最適化。

しかし, (私は非常に限られた知識のx86組み立て)を返しオブジェからの機能の一般的配分を伴十分なスペースのサイトのアドレスはスタックに充填することによってコピーする返り値です。これは基本的に同じる out は、省略不要の一時的なコピーの値から対象のメモリ場所にアクセスできます。

その理由を回避outパラメータはコードの読みやすさよります。

値の種類が違っても必ずコピー)のための参照型では基本的には同じよ。

四のいないほうがよい自分でダムを記録クラスではなく、outパラメータは簡単に読んで理解しのコードです。

Outパラメータを抜いてしまうことが確認された。のみを指すポインタに渡されるスタックです。

ご値の型が大きく、コピー、そして逆参照のポインタが各変数の使用。

使用出力パラメータは傷つかない。Outパラメータは基本的に参照パラメータでも、呼び出し側の相手先の同作品のメモリを消費します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top