2014-10-15 2 views
3

Я разрабатываю приложение Scala, которое сканирует некоторые папки в течение 10 минут. Внутри моего класса я создал как 12 глобальных переменных, и это странно, потому что некоторые переменные используются только один раз в точке исключения.Какова стоимость доступа к свойству конфигурации?

мне было интересно, что стоимость использования:

configuration.getString ("значение")

Каждый раз, когда вместо того, чтобы создать глобальную переменную типа:

частный lazy val inputPath = configuration.getString ("main.directory")

С точки зрения производительности, что лучше? Вызывать только тогда, когда это необходимо или создать ленивую глобальную переменную?

Благодарим заранее.

ответ

7

configuration.getString("value") очень дешево. Конфигурация будет считываться и анализироваться один раз при запуске, а затем значения сохраняются в java Map. Таким образом, в основном вызов getString сводится к поиску в HashMap. Это, конечно, дороже, чем общая переменная, но по-прежнему остается постоянной сложностью O (1). Это должно быть хорошо, особенно если вы звоните getString только пару раз каждые 10 минут.

Реализация im, ссылаясь на то, что находится в sources of typesafe/config on GitHub. Строка 30 - это карта, в которой хранятся значения.


Update: Ваш вопрос пришел мне в голову сегодня утром, и он вдруг ударил меня, почему это плохая идея назвать getString вместо инициализации разделяемой переменной со значением. Это не сразу пришло мне в голову, потому что это не имеет никакого отношения к производительности:

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

В вашем вопросе вы использовали lazy val как альтернативу, которая была бы подвержена той же самой проблеме, поскольку она была бы оценена только при необходимости. Поэтому, на мой взгляд, вы должны прочитать все значения конфигурации в val s в начале программы!

private val inputPath = configuration.getString("main.directory") 

Это делает, конечно, не применяется, если вы используете замещающего значения и 100% уверены, что не будет никаких исключений.

+3

«Это должно быть хорошо, особенно если вы вызываете' getString' всего пару раз каждые 10 минут ». Я бы сказал: «Это должно быть хорошо, особенно если вы используете I/O для сканирования каталогов». – rightfold

+0

Да, я получаю только путь к каталогу и заменяю часть, чтобы найти клиентский каталог. Это простая операция. – placplacboom

+0

@ rightføld, вы абсолютно правы! –

Смежные вопросы