阅读app.config贵吗?

时间:2012-03-05 15:17:08

标签: c# performance coding-style 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),但很多次。需要我有几个成员变量来存储app.config文件中的值吗?什么是最好的方法。感谢。

5 个答案:

答案 0 :(得分:18)

我确信默认情况下会缓存所有配置文件(web.config或app.config),因此您无需创建包含所有值的静态类,也不必担心永久访问文件。

以下是一些阅读:

关于您访问​​其他应用程序配置文件的要求:

MSDN:“这些方法(注意:对于客户端应用程序:ConfigurationManager.GetSection )提供对当前应用程序的缓存配置值的访问,其性能优于配置类。“

换句话说:是的,你应该缓存它,当它不是你自己的应用程序的配置文件时。

答案 1 :(得分:6)

任何以磁盘IO结尾的东西都很昂贵(当然谈论旋转媒体时)。

请参阅Quora上的What are the numbers that every computer engineer should know, according to Jeff Dean?,了解速度的差异。

如果您反复读取文件,则应缓存结果(特别是如果文件没有更改)。

使用默认配置时,.config文件只在应用程序启动时读取一次,结果将缓存在内存中。


按要求更新示例:

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;
}

假设它存在于具有应用程序生命周期的类中,您现在已将该配置缓存在内存中以用于应用程序的生命周期。

答案 2 :(得分:3)

你不是真的在这里做I / O,至少不是直接做。

假设Config系统将缓存值,并且仅在遇到性能问题时才采取措施。

使用DIY缓存无处不在的代码是不值得的。

答案 3 :(得分:2)

从app.config读取只是您第一次执行应用程序时。之后,它会将此配置存储在内存中,并在您需要访问时从中读取。这就是为什么,在app.config中更改不会影响当前正在运行的应用程序。

答案 4 :(得分:2)

虽然正在缓存来自app.config的值,但在多线程场景中经常读取它们可能会导致严重的性能损失。如果必须同时访问配置值,最好使用自己的缓存。您可以从AppSettingsBase类派生自定义实现。

通常,在大多数情况下,将默认配置管理器包装到自己的实现中将是一个很好的设计决策。它不仅可以保证您更改(客户?)配置设置名称。但是,您还可以灵活地缓存这些值,或者从可能/变得重要的任何其他来源获取它们。