Es la aplicación de lectura.config caro?


No hay duda de que todavía estoy a ser golpeado por cualquier cuello de botella de velocidad de lectura. Estoy pidiendo saber; si la aplicación de lectura.config frecuentemente es una mala elección de programación. He sabido de operaciones de base de datos cada vez más caro.

En mi caso no estoy leyendo la aplicación de mi propia aplicación.config, pero de otro proyecto , así:

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;
}

Escenario: Tengo una clase manager (y solo una de estas clases) donde tengo que leer unos pocos valores (3 a 4) de un archivo de configuración especificado por una ruta física, pero muchas veces. Necesito tener algunas variables de miembro para almacenar los valores de la aplicación.archivo de configuración? Cuál sería el mejor enfoque. Gracias.

Author: nawfal, 2012-03-05

5 answers

Estoy seguro de que todos los archivos de configuración(web.configuración o aplicación.config) se almacenan en caché de forma predeterminada, por lo que no es necesario crear una clase estática que contenga todos los valores o tener miedo de que se acceda a los archivos de forma permanente.

Aquí hay algunas lecturas:

Con respecto a su requisito de acceder al archivo de configuración de otra aplicación:

MSDN : "Estos métodos( nota: para aplicaciones cliente: ConfigurationManager.GetSection) proporcione acceso a los valores de configuración almacenados en caché para la aplicación actual, que tiene un mejor rendimiento que la clase de configuración."

En otras palabras: Sí, debes almacenarlo en caché cuando no sea el archivo de configuración de tu propia aplicación.

 16
Author: Tim Schmelter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-01 06:51:13

Cualquier cosa que termine con disk IO es cara (definitivamente cuando se habla de medios rotativos).

Ver ¿Cuáles son los números que todo ingeniero informático debe saber, según Jeff Dean? en Quora para ver las diferencias de velocidad.

Si está leyendo un archivo repetidamente, debe almacenar en caché los resultados (en particular si el archivo no cambia).

Cuando se utiliza la configuración predeterminada, el archivo .config solo se lee una vez, al iniciar la aplicación y los resultados se almacenan en caché en la memoria.


Actualización, ejemplo según lo solicitado:

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;
}

Asumiendo que esto vive en una clase que tiene la vida útil de la aplicación, ahora ha almacenado la configuración en caché en memoria durante la vida útil de la aplicación.

 6
Author: Oded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 15:45:35

Realmente no estás haciendo E/S aquí, al menos no directamente.

Simplemente asuma que el sistema de configuración almacenará en caché los valores, y solo tomará medidas cuando tenga un problema de rendimiento.

No vale la pena saturar su código con el almacenamiento en caché DIY en todas partes.

 3
Author: Henk Holterman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 15:25:32

Leyendo desde la aplicación.config es la primera vez que ejecuta la aplicación. Después de eso, almacenará esta configuración en memoria y leerá de ella cada vez que necesite acceso. Es por eso que, cambiando en la aplicación.la configuración no afectará a la aplicación en ejecución actual.

 2
Author: Min Min,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 15:25:47

Mientras que los valores de la aplicación.la configuración se almacena en caché, y leerla con frecuencia en un escenario multiproceso puede provocar un grave impacto en el rendimiento. Si tiene que acceder a los valores de configuración simultáneamente, será mejor usar su propio almacenamiento en caché. Puede derivar una implementación personalizada de la clase AppSettingsBase.

En general, envolver el gestor de configuración predeterminado en una implementación propia será una buena decisión de diseño en la mayoría de los casos. Te mantiene no solo a salvo de los cambios a su (cliente?) nombres de configuración. Pero también le da la flexibilidad para almacenar en caché esos valores u obtenerlos de cualquier otra fuente que pueda ser importante.

 2
Author: Haymo Kutschbach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 15:43:43