web-dev-qa-db-ja.com

app.configを読むのは費用がかかりますか?

読み取り速度のボトルネックにまだ見舞われていないことは間違いありません。私は知りたいと思っています。 app.configを頻繁に読むことが、プログラミングの選択として不適切な場合。私はデータベース操作が高価になることを知っています。

私の場合、私は自分のアプリケーションのapp.configを読んでいませんが、別のプロジェクトのapp.configを読んでいます、次のようになります。

private string GetAppConfigValue(string key)
{
    ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
    fileMap.ExeConfigFilename = GetConfigFilePath();
    Configuration appConfig = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
    return appConfig.AppSettings.Settings[key].Value;
}

シナリオ:物理パスで指定された構成ファイルからいくつかの値(3から4)を読み取る必要があるマネージャークラス(およびそのようなクラスは1つだけ)がありますただし何度も。 app.configファイルの値を保存するためのメンバー変数がいくつか必要ですか?最善のアプローチは何でしょうか。ありがとう。

28
nawfal

すべての構成ファイル(web.configまたはapp.config)がデフォルトでキャッシュされていると確信しているので、すべての値を保持する静的クラスを作成したり、ファイルが永続的にアクセスされることを恐れたりする必要はありません。

ここにいくつかの読書があります:

別のアプリケーションの構成ファイルにアクセスするための要件に関して:

[〜#〜] msdn [〜#〜] : "これらのメソッド(注:クライアントアプリケーションの場合: ConfigurationManager.GetSection)現在のアプリケーションのキャッシュされた構成値へのアクセスを提供します。これは、Configurationクラスよりもパフォーマンスが優れています。」

言い換えれば:はい、それがあなた自身のアプリの設定ファイルでないときはそれをキャッシュするべきです

18
Tim Schmelter

ディスクIOで終わるものはすべて高価です(回転メディアについて話すときは間違いなく)。

速度の違いを確認するには、Quoraの Jeff Deanによると、すべてのコンピューターエンジニアが知っておくべき数値は何ですか? を参照してください。

ファイルを繰り返し読み取る場合は、結果をキャッシュする必要があります(特にファイルが変更されない場合)。

デフォルト構成を使用する場合、.configファイルは、アプリケーションの起動時に1回だけ読み取られ、結果はメモリにキャッシュされます。


更新、要求に応じた例:

private Configuration appConfig;

private Configuration GetConfig()
{
    if (appConfig != null)
        return appConfig;

    ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
    fileMap.ExeConfigFilename = GetConfigFilePath();
    appConfig = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

    return appConfig;
}

これがアプリケーションの存続期間を持つクラスに存在すると仮定すると、アプリケーションの存続期間中、構成をメモリにキャッシュしました。

6
Oded

ここでは、少なくとも直接ではなく、実際にはI/Oを実行していません。

Configシステムが値をキャッシュし、パフォーマンスに問題がある場合にのみアクションを実行すると想定してください。

どこでもDIYキャッシュでコードを乱雑にする価値はありません。

3
Henk Holterman

App.configからの読み取りは、アプリケーションを実行したときだけです。その後、この構成をメモリに保存し、アクセスが必要なときにいつでもそこから読み取ります。そのため、app.configを変更しても、現在実行中のアプリケーションには影響しません。

2
Min Min

App.configの値がキャッシュされている間、マルチスレッドシナリオでそれらを頻繁に読み取ると、パフォーマンスが大幅に低下する可能性があります。構成値に同時にアクセスする必要がある場合は、独自のキャッシュを使用することをお勧めします。 AppSettingsBaseクラスからカスタム実装を派生させることができます。

一般に、デフォルトの構成マネージャーを独自の実装にラップすることは、ほとんどの場合、適切な設計上の決定になります。それはあなたの(顧客?)設定設定名の変更からあなたを安全にするだけではありません。ただし、これらの値をキャッシュしたり、重要になる可能性のある他のソースから取得したりする柔軟性も提供します。

2