更高效?从 app.config 读取还是在全局变量中存储一次?

问题描述

我已经在这里查找了所有“更高效”的帖子,但没有一个直接回答这个问题,所以我需要一些聪明的头脑来帮助我。

我目前将设置存储在 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,但不想显示它,除非该模式在应用程序中为“真”。配置:

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;

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

谢谢!

解决方法

首先不要刷新该部分,该变量已经存储在“全局”变量中。刷新会强制读取文件,这是一个 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];
        }

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