質問
い 施 パラメータ 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パラメータは基本的に参照パラメータでも、呼び出し側の相手先の同作品のメモリを消費します。