2009-03-16 9 views
2

私は、シングルトンクラスでも静的クラスでもないクラスを持っています。状態はありますが、となる可能性があります。私は共有状態があるときにシングルトンから離れるのが好きですが、私が聞いている議論は、ある時点でオブジェクトのインスタンスが1つしか存在していないことから、パフォーマンスの利点を得ることです。パフォーマンスは、シングルトンクラスまたは静的クラスを持つ十分な理由ですか?

私の特別なケースでは、このオブジェクトに関連する多くのデータはありません - それぞれ最大150のエントリを持つ2つの辞書と辞書。

パフォーマンス・アーギュメントは、いつどのようなメリットがありますか?

FYI - .NETを使用しています。

ありがとうございます!

+0

この議論は、なぜ*シングルトンがどんな場合に速くなるのだろうと言及しましたか?それ以外の場合は、あなたのコードの基盤となる信仰の跳躍と思われます。 – jalf

+0

免責事項 - 私は引数(したがって質問)を信じていませんが、1)インスタンスが1つしか存在できない場合、メモリフットプリントがより小さくなります。2)オブジェクトが存在する場合、新しいインスタンスをインスタンス化するオーバーヘッドが減少します。一度しか構築されません。 –

+0

新しいオブジェクトを作成するのはどれくらいの費用がかかりますか? perfリクエストをサポートするにはかなりの費用がかかります –

答えて

5

いいえ。performance引数にはメリットがありません。

パフォーマンスの問題があると想定する前に、ベンチマークして確認してください。 10のうち9回はあなたが思った場所にはなりません。

シングルトンが必要な場合は、それだけです。

+0

あまりにも早すぎる最適化のようなにおいがします。 –

+0

シングルトンはほとんど必要ありません。シングルトンを支持するほとんどの議論にはメリットはない。 ;) (「ただ1つのインスタンス」を実行したいと思う唯一のケースは、ドライバ開発などにあり、ハードウェアに直接マッピングすることです) – jalf

1

パフォーマンスは、シングルトンパターンを使用するか否かのどちらかというと非常に強い議論ではないと思います。設計上の問題です。シングルトンを使用するのは理にかなっているかどうかです。

オブジェクトのインスタンスが1つだけ必要な場合は、シングルトンを使用します。

複数のインスタンスが必要な場合は実行しないでください。

+0

ちょうど1つのインスタンスが必要な場合は、正確に1つのインスタンスを宣言します。 2つのインスタンスを宣言すると、世界がクラッシュする可能性がある場合は、それをシングルトンにします。 – jalf

+0

@jalf - そうだね、私たちは皆、アンチグレアの観点からサイングーンを聞いたことがあります。私のアドバイスは、あなたがシングルトンに対するいくつかの不条理な偏見を持っていないと仮定しています。 –

2

シングルトンパターンはほとんどの場合、クラスのインスタンスを1つしか必要としないように指定できます。静的クラスは、一般的にステートレスな動作を提供するために使用されます。あなたが描写していることは、どちらのカテゴリーにも合わないようです。コードのパフォーマンスを向上させるために、シングルトンパターンではなくキャッシュを使用して調査します。もちろん、キャッシュはシングルトンでもかまいませんが、キャッシュの場合は意味があります。

もちろん、あなたのオブジェクトがキャッシュであれば、私は自分自身を円にしました。

+0

LOL「もちろん、あなたのオブジェクトがキャッシュであれば、私はちょうどサークルに自分自身を話しました。 " –

2

パフォーマンス上の理由から、シングルトン(またはスタティック)クラスを作成することについて考えるべきではありません。

のデザインでをシングルトンにする必要があります。あなたのクラスの複数のインスタンスが存在し、互いに異なる必要がある場合は、シングルトンを使用することはできません。

0

構築に大きなコストがかかる場合は、共通インスタンスを返すパターンAbstract Factoryに適しているでしょう。シングルトンは、特にTDD群衆では評判が悪いですが、効果的にAFとシングルトンは同じことをすることができます(AFはもっと多くのことをすることができますが、それは別の話です)。

コストがかからないので、おそらく問題ありません。

0

通常、シングルトンはパフォーマンスを阻害します。つまり、にはがあり、マルチスレッドアプリケーションでクラスをロックおよび同期させることができます。シングルトンやグローバルが使用されていないと、これは避けられた可能性があります。

だから、シングルトンは遅くなるかもしれませんが、速くなるとは思えません。

アプリケーションでオブジェクトの1つのインスタンスを共有する場合は、そのオブジェクトへの参照を渡します。また、キャッシングや並行性の理由から、複数の別々のインスタンスを使用すると、実際には高速になっていることが判明したときに、設計を後から変更する柔軟性が残ります。

パフォーマンスについて最も重要なことは、予測が難しいことです。あなたのボトルネックが何であるかにかかわらず、あなたはほぼ間違っています。したがって、良いパフォーマンスを保証する最も良い方法は、プログラムを簡単に変更できるようにすることです。シングルトンはそこであなたに対して働きます。シングルトンを取得したら、削除することはほとんど不可能です。グローバル・シングルトンではなくローカル変数がキャッシュ使用率を向上させたとしても、複数のインスタンスがうまく実行されたとしても、クラスの1つの普遍的なインスタンスに悩まされています。

+0

2つ以上の参照に従う必要はないが、実際には何にも影響を及ぼさない現実であるならば、シングルトンはより速くなるかもしれない。 –

+0

なぜそれが速くなるのか?あなたはメソッド呼び出しごとに1つ少ない参照をコピーする必要があるので、私は基本的に1サイクルについて話していますが、それは今日のCPUでもそうでないかもしれません。 – jalf

+0

の参照を渡すことは、あなたが話す柔軟性を提供する醜い方法です。静的なCreateInstanceメソッドから全く同じ柔軟性を得ることができます。あなたが望むならば、初期化されたazy)、それ以降は、それを変更して、必要な数のインスタンスを作成することができます。 –

1

概念的にがオブジェクトの1つのインスタンスにしかなり得ず、人為的に開発者を1つのインスタンスに制限しない場合にのみ、シングルトンを使用する必要があります。 2つのインスタンスが存在する可能性がある場合は、シングルトンであってはなりません。

前者が該当し、オブジェクトに関連付けられた状態が存在する場合、初期化に関連するコストが高く、クラスが決して使用されない可能性がある場合や、初期化。その場合、シングルトンは良いです。代わりに私たちは静的クラスを使用します。上記が適用されない場合は、必ず使用してください。

関連する問題