ConfigurationManager.AppSettings 性能问题

Posted

技术标签:

【中文标题】ConfigurationManager.AppSettings 性能问题【英文标题】:ConfigurationManager.AppSettings Performance Concerns 【发布时间】:2010-09-05 11:20:09 【问题描述】:

我计划将我的所有配置设置存储在我的应用程序的 app.config 部分(使用 ConfigurationManager.AppSettings 类)。当用户使用应用程序的 UI 更改设置时(单击复选框、选择单选按钮等),我计划将这些更改写到 AppSettings。同时,当程序运行时,我计划从一个不断处理数据的进程中不断地访问AppSettings。通过 UI 更改设置需要实时影响数据处理,这就是为什么进程会不断访问AppSettings

在性能方面这是个好主意吗?在编写.Net应用程序时,使用AppSettings应该是存储和访问配置设置的“正确方法”,但我担心这种方法不适合持续加载(至少在不断读取的设置方面) .

如果有人有这方面的经验,我将不胜感激。

更新:我应该澄清几点。

这不是一个 Web 应用程序,因此将数据库连接到应用程序可能只是为了存储配置设置而过度使用。这是一个 Windows 窗体应用程序。

根据 MSDN 文档,ConfigurationManager 不仅用于存储应用程序级别设置,还用于存储用户设置。 (例如,如果应用程序作为部分信任应用程序安装,则尤其重要。)

更新 2: 我接受了 lomaxx 的回答,因为 Properties 确实看起来是一个不错的解决方案,而无需向我的应用程序(例如数据库)添加任何额外的层。使用属性时,它已经完成了其他人建议的所有缓存。这意味着任何更改和后续读取都在内存中完成,因此速度非常快。属性仅在您明确告知时才将更改写入磁盘。这意味着我可以在运行时即时更改配置设置,然后仅在程序退出时才最终保存到磁盘。

为了验证它确实能够处理我需要的负载,我在笔记本电脑上进行了一些测试,使用 Properties 每秒可以进行 750,000 次读取和 7,500 次写入。这远远超出了我的应用程序永远甚至接近需要的程度,我觉得在不影响性能的情况下使用属性非常安全。

【问题讨论】:

【参考方案1】:

由于您使用的是 winforms 应用程序,如果它在 .net 2.0 中,实际上有一个为此目的而设计的用户设置系统(称为属性)。 This article on MSDN 对此有很好的介绍

如果您仍然担心性能问题,请查看SQL Compact Edition,它与 SQLite 类似,但我发现它是 Microsoft 的产品,我发现它与 winforms 配合得非常好,甚至还有make it work with Linq 的功能。

【讨论】:

【参考方案2】:

查看 SQLite,对于这种特殊情况,它似乎是一个不错的选择。

【讨论】:

【参考方案3】:

迪伦,

不要为此使用应用程序配置文件,而是使用 SQL DB(SQLite、mysql、MSSQL 等),因为您不必担心读取和写入配置文件期间的并发问题。

您还可以更灵活地选择要存储的数据类型。 appSettings 部分只是一个键/值列表,随着时间的推移和应用程序的成熟,您可能会超出它。您可以使用自定义配置部分,但是当涉及到设计时,您会进入一个新的问题区域。

【讨论】:

【参考方案4】:

appSettings 并不真正适用于您正在尝试做的事情。

当您的 .NET 应用程序启动时,它会读取 app.config 文件,并将其内容缓存在内存中。出于这个原因,在您写入 app.config 文件后,您必须以某种方式强制运行时重新解析 app.config 文件,以便它可以再次缓存设置。这是不必要的

最佳方法是使用数据库来存储您的配置设置。

除非使用数据库,否则您可以轻松设置外部 XML 配置文件。当您的应用程序启动时,您可以将其内容缓存在 NameValueCollection 对象或 HashTable 对象中。当您更改/添加设置时,您将对缓存副本执行此操作。当您的应用程序关闭时,或在适当的时间间隔内,您可以将缓存内容写回文件。

【讨论】:

【参考方案5】:

如果我错了,请有人纠正我,但我不认为 AppSettings 通常用于这些类型的配置设置。通常,您只会放入保持相当静态的设置(数据库连接字符串、文件路径等)。如果您想存储可自定义的用户设置,最好创建一个单独的首选项文件,或者最好将这些设置存储在数据库中。

【讨论】:

【参考方案6】:

我不会使用配置文件来存储用户数据。使用数据库。

【讨论】:

【参考方案7】:

请问您为什么不将用户的设置保存在数据库中?

一般来说,我会在 appSettings 部分保存很少更改的应用程序设置(默认电子邮件地址错误日志发送到的位置、自动注销的分钟数等)。在应用程序,而不是在用户,通常用于部署设置。

【讨论】:

【参考方案8】:

我想做的一件事是在读取时缓存 appsettings,然后在写入时从缓存中刷新设置,这样可以最大限度地减少服务器为处理 appSettings 而必须处理的实际负载量。

此外,如果可能,请考虑将 appSettings 分解为 configSections,以便您可以读取写入和缓存相关设置。

说了这么多,我会认真考虑将这些值存储在数据库中,因为您实际上存储的是用户首选项,而不是应用程序设置。

【讨论】:

以上是关于ConfigurationManager.AppSettings 性能问题的主要内容,如果未能解决你的问题,请参考以下文章