【问题标题】:More efficient? Read from app.config or store once in global variable?更高效?从 app.config 读取或在全局变量中存储一次?
【发布时间】:2021-05-10 22:07:24
【问题描述】:

我在这里查看了所有“更高效”的帖子,但没有人直接回答这个问题,所以我需要一些大智慧来帮助我。

我目前将设置存储在 app.config 中,并根据需要获取值。我用这个方法:

public static string AppConfig_GetKeyValue(string strAppSettingKeyName)
        {
            ConfigurationManager.RefreshSection("appSettings");
            string myAppSettingValue = ConfigurationManager.AppSettings[strAppSettingKeyName];
            return myAppSettingValue;
        }

问题是......如果我正在执行大量操作,例如 SQL 插入或将信息写入屏幕或终端,是否更好地全局存储该值以提高速度/效率?例如:

如果在每次 SQL 插入时,我们都会检查 app.config 中的值:

<add key="mySQLLogging" value="true"/> 

与声明全局类似:

public static bool mySQLLoggingOn = bool.Parse(TTLog.AppConfig_GetKeyValue("mySQLLogging"));

哪个更好?也许简要解释一下原因?

作为第二个示例,我为用户将内容记录到屏幕上,但如果我想要详细信息,则在每行中包含文本 DEBUG,但除非该模式在 app.js 中为“true”,否则不想显示它。配置:

public static void DoWriteLine(string strMessage, bool blnShowDateStamp = true, ConsoleColor clrForeColor = ConsoleColor.Green, ConsoleColor clrBackColor = ConsoleColor.Black)
    {
        if (strMessage.ToLower().Contains("debug") && !(bool.Parse(AppConfig_GetKeyValue("myModeDebugOn"))) 
            return; // If app.config key is false, don't process message to the screen
        Console.ForegroundColor = clrForeColor;
        Console.BackgroundColor = clrBackColor;
        if (blnShowDateStamp)
            Console.WriteLine(("[ " + DateTime.Now.ToString("ddd MM/dd/yyyy hh:mm:ss.fff") + " ] -> " + strMessage).PadRight(Console.WindowWidth - 1));
        else
            Console.WriteLine((strMessage).PadRight(Console.WindowWidth - 1));
        Console.ResetColor();
    }   

以上,显然是对应app.config中的key:

<add key="myModeDebugOn" value="True"/>

然后,可能每秒都必须处理这个:

if (strMessage.ToLower().Contains("debug") && !(bool.Parse(AppConfig_GetKeyValue("myModeDebugOn"))) 
                return;

那么所有这些文件读取操作的效率都低了吗?我只记得从学习编程的第一天起,永远不要使用全局变量,这很糟糕。

谢谢!

【问题讨论】:

  • 当询问效率时,真的很难说...您需要设置基准并自己衡量。结果很大程度上取决于特定的机器,因此即使在您的 PC 上运行基准测试也只能提供一些见解,而不是确定的答案。
  • 调用 RefreshSection 意味着你想在不停止程序的情况下重新读取配置。是否允许在程序运行时更改配置?这可能很昂贵。您需要使用和不使用该行来测试您的代码。当然没有它你应该得到更好的时机。
  • Obligatory link to Eric Lippert's rant on performance questions。基本上,在你运行代码的情况下自己测量它。
  • 谢谢@HereticMonkey 和 Michal ...我想我现在必须学习如何进行基准测试...很好奇其他人是否已经经历过全局与文件读取,但我会想办法的我猜。谢谢。

标签: c# global-variables processing-efficiency


【解决方案1】:

首先不要刷新该部分,并且该变量已经存储在“全局”变量中。刷新会强制读取文件,这是一个 IO 操作,因此开销很大。

检查Does ConfigurationManager.AppSettings[Key] read from the web.config file each time? 以查看AppSettings 属性的反汇编代码。该数组被加载一次,然后可以通过静态属性访问。

和你自己的静态变量一样。

所以这个:

public static string AppConfig_GetKeyValue(string strAppSettingKeyName)
        {
            // ConfigurationManager.RefreshSection("appSettings");
            return ConfigurationManager.AppSettings[strAppSettingKeyName];
        }

几乎等同于你自己的全局静态变量。我希望差异最小,主要基于这两者之间的基准测试时的机器负载。

【讨论】:

  • 确实如此。该行仅用于重新加载该部分,以防在程序启动后预期在 appSettings 部分中发生更改。如果询问者希望发生更改,那么保留全局变量以避免从文件中读取节键时不存在延迟是没有意义的
  • 我的问题是,没有刷新,我没有得到实际值。如果在其他地方更改了值,我将无法获得新值并且刷新解决了问题......但是......可能会产生更多开销。
猜你喜欢
  • 2013-12-01
  • 2021-10-03
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2020-02-26
相关资源
最近更新 更多