Дорогое чтение app.config? - PullRequest
       49

Дорогое чтение app.config?

26 голосов
/ 05 марта 2012

Никаких вопросов. Мне еще предстоит столкнуться с любым узким местом в скорости чтения.Я прошу знать;если чтение 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?Какой будет лучший подход.Благодаря.

Ответы [ 5 ]

18 голосов
/ 05 марта 2012

Я уверен, что все файлы конфигурации (web.config или app.config) кэшируются по умолчанию, поэтому вам не нужно создавать статический класс, который содержит все значения, или бояться, что к файлам обращаются постоянно.

Вот некоторые чтения:

Относительно вашего требования для доступа к файлу конфигурации другого приложения:

MSDN : «Эти методы ( примечание: для клиентских приложений: ConfigurationManager.GetSection ) обеспечивают доступ к кэшированным значениям конфигурации для текущейприложение, которое имеет лучшую производительность, чем класс конфигурации. "

Другими словами: Да, вы должны кэшировать его , когда это не файл конфигурации вашего собственного приложения.

6 голосов
/ 05 марта 2012

Все, что заканчивается дисковым вводом-выводом, стоит дорого (определенно, когда речь идет о вращающихся носителях).

См. Какие цифры должен знать каждый компьютерный инженер, согласно Джеффу Дину? на Quora, чтобы увидеть разницу в скорости.

Если вы читаете файл несколько раз, вам следует кэшировать результаты (в частности, если файл не изменяется).

При использовании конфигурации по умолчанию файл .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;
}

Предполагая, что это происходит в классе, у которого есть время жизни приложения, вы теперь кэшировали конфигурацию в памяти на время жизни приложения.

3 голосов
/ 05 марта 2012

Вы на самом деле здесь не делаете ввод-вывод, по крайней мере, не напрямую.

Просто предположите, что система Config будет кэшировать значения и действовать только тогда, когда у вас есть проблемы с производительностью.

Не стоит загромождать ваш код кешированием по всему миру.

2 голосов
/ 05 марта 2012

Во время кэширования значений из app.config частое их чтение в многопоточном сценарии может привести к серьезному снижению производительности.Если вам необходимо получить доступ к значениям конфигурации одновременно, лучше использовать собственное кэширование.Вы можете получить пользовательскую реализацию из класса AppSettingsBase.

В целом, обернуть менеджер конфигурации по умолчанию в собственную реализацию в большинстве случаев будет хорошим решением.Он не только защищает вас от изменений имен ваших (клиента?) Настроек конфигурации.Но также дает вам гибкость для кэширования этих значений или получения их из любого другого источника, который может оказаться важным.

2 голосов
/ 05 марта 2012

Чтение из app.config только в первый раз, когда вы запустили приложение. После этого он сохранит эту конфигурацию в памяти и будет читать ее всякий раз, когда вам понадобится доступ. Вот почему изменение в app.config не повлияет на текущее работающее приложение.

...