阅读 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 是不是昂贵?的主要内容,如果未能解决你的问题,请参考以下文章