阅读 app.config 是不是昂贵?

Posted

技术标签:

【中文标题】阅读 app.config 是不是昂贵?【英文标题】:Is reading app.config expensive?阅读 app.config 是否昂贵? 【发布时间】:2012-03-23 01:36:33 【问题描述】:

毫无疑问,我还没有遇到任何读取速度瓶颈。我想知道;如果经常阅读 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 文件中的值吗?什么是最好的方法。谢谢。

【问题讨论】:

您始终可以将appConfig 缓存为静态值,这样您只需读取一次app.config。 @jrummell,没错。我的问题是,这是正确的方法吗?是否有性能影响?等 远程app.config的网络连接有多好? @ShellShock,哈哈它在同一台机器上:) @nawfal。由于它是一个基于 XML 的文档,因此框架会在内部解析该文档并肯定会影响其性能。供您参考,在最新的 .net 框架中,所有配置文件都是基于 JSON 而不是基于 XML 【参考方案1】:

任何以磁盘 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;

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

【讨论】:

Oded,缓存有具体的实现吗?还是只分配给静态变量就可以了? @nawfal - 您可以缓存整个 Config 对象。 @Oded 你能提供一个在对象中缓存的小例子吗?谢谢 如果您重复读取磁盘文件,OS 肯定会为您进行缓存吗? @MartinThompson - 可能,但配置往往占用如此少的内存,以至于您经常引用它,这样做是有意义的。我同意在优化之前应该进行测量,但这是一件很简单的事情,而且做对了......【参考方案2】:

您实际上并没有在这里进行 I/O,至少不是直接进行。

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

在任何地方都使用 DIY 缓存来弄乱您的代码是不值得的。

【讨论】:

就我而言,app.config 不是同一个项目的,而是另一个项目的。你能给出这个意义上的观点吗? 嗯,是的,我错过了。也许保留appConfig 是明智之举,但这实际上取决于您拨打了多少电话以及需要的范围。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

这里有一些阅读:

Web.Config is Cached ConfigurationManager.RefreshSection Method Application Configuration Files Explained ASP.NET Configuration Overview

关于您访问​​另一个应用程序的配置文件的要求:

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

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

【讨论】:

就我而言,app.config 不是同一个项目的,而是另一个项目的。你能给出这个意义上的观点吗?我在问题中提到过。 @nawfal: MSDN 说:“这些方法(对于客户端应用程序:ConfigurationManager.GetSection)提供对当前应用程序的缓存配置值的访问,其性能比配置类更好。”换句话说:你是对的,当它不是你自己的应用程序配置文件时,你应该缓存它。 (相应地编辑了我的答案) MSDN 关于缓存应用配置的评论并不意味着非应用配置不会被缓存。我通过打开一个非应用程序配置,在程序外部修改它并重新打开它进行了测试。我第二次打开文件时没有看到我的更改。【参考方案5】:

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

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

【讨论】:

以上是关于阅读 app.config 是不是昂贵?的主要内容,如果未能解决你的问题,请参考以下文章

Flask配置文件的几种方法

app.config 中元素的顺序是不是重要?

从 app.config 文件中读取

c# Windows服务是不是(可能)使用app.config

MSTest 和 app.config 问题

.Net 4.0 C# 项目中是不是需要 app.config?