.Net 静的メソッドとその同時実行性への影響?
-
21-08-2019 - |
質問
現在、Webサービスで使用するAPIを構築しています。
大量の 静的メソッド.
当初のアイデアは、サービスとして機能するエキスパート オブジェクトを構築することでした。
シングル ユーザー環境では、このアプローチは素晴らしかったです。しかし、すぐにこれをマルチ/同時ユーザー環境に移植する必要があります。
この種のアーキテクチャではどのようなパフォーマンスの問題が発生する可能性がありますか?
よろしくお願いします、
編集:
静的メソッドは静的変数を保持せず、副作用もありません。これらは、すべてがインスタンス化される通常のルーチンを実行するだけです。(すなわち。変数とオブジェクト)
解決
同時実行性には特に影響はありません。同じルールが当てはまります。共有データを同時に変更することは好ましくありません。インスタンス メソッドがあっても何も変更しない場合は、問題ありません。
ただし、一般的な設計には違いがあります。静的メソッドはほとんど常にスレッドセーフでなければなりません (つまり、あなたがすべき 作る インスタンス メソッドは通常、スレッド セーフである必要はありません (ただし、クラスのスレッド セーフを文書化する必要があります)。
他のヒント
私はパフォーマンスの問題にはあまり関心がありません (Knuth)。私はマルチスレッド環境でのテストのしやすさと状態管理の問題にもっと関心を持っています。主にコーディングとメンテナンスの複雑さを軽減するためです。これは、プロジェクトをさらに悪化させる可能性があります。時折発生するパフォーマンスの問題。
静的をモックすることはできないため、静的メソッドに基づく API を使用するコードは比較的テストしにくいと思います。あなたが求めていることは実際にはそうではありませんが、API を使用する人のことを考えてください。
スレッド間で共有データが保持されるポイントを最小限に抑える必要があります。これにより、スレッドの問題が発生する可能性が減ります。これを行うとおそらく効率が少し失われますが、コーディングとメンテナンスが容易になります。すべてのページが静的だった場合、ASP.NET アプリケーションを作成してテストするのがどれほど難しいかを想像してみてください。それは悪夢でしょう。時間が経つにつれて API に機能が追加されるにつれて、その道をたどることになるかもしれません。
また、まともな DI フレームワークを使用してください (私は Unity だと思いますが、P&P から出てくるのが最良のものかもしれません)。
静的メソッドのローカル変数について心配する必要はありません。各スレッドには独自のスタックがあり、メソッドの呼び出しごとにスタック上にローカル変数の個別のコピーが作成されます。たとえば、MS がアプリケーション ブロックで提供する SqlHelper メソッドは、まさにこの技術を使用しています。
主な問題は静的変数です。私は静的変数をほとんど使用しません。必要性もありませんでした。