Жесткое кодирование значений и чтение из файла



Это общий вопрос об эффективности жесткого кодирования данных - я пишу программу на Java, которая делает некоторый химический анализ, и мне нужно использовать изотопное содержание различных элементов. Способ, которым я его настроил прямо сейчас, заключается в том, что все значения (которые никогда не нужно изменять) хранятся в качестве конечных полей в моем классе, т. е.



static final double C12Abundance = .989;
static final double C12Mass = 12;


Многие подобные программы хранят этот тип данных в XML-файле, а затем считывают оттуда значения, например:



<compounds>
<elements>
<element symbol='C' mono_isotopic_mass ='12.00000000000' abundance='.989'/>


Есть ли какие-либо причина (производительность, память и т. д.) Читать из него таким образом? Кажется, проще просто оставить его как поле.

613   8  

8 ответов:

Жесткое кодирование намного быстрее с точки зрения производительности и выделения памяти.

То, что вы получаете от чтения из файла,-это повторное использование кода (запуск программы с различными параметрами без необходимости ее перекомпиляции).

Обратите внимание, что чтение из файла имеет следующие шаги:
  1. объявите переменную, которая будет использоваться для хранения значения.
  2. создайте входной (потоковый) объект
  3. инициализируйте его с помощью пути
  4. Откройте файл из FS
  5. найти правильная строка для чтения из
  6. считайте значение
  7. сохраните его в переменной выше
  8. закройте вход (Поток)

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

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

public enum Element {
    //  Name Mass  Abund
    C12("C", 12.0, .989),
    He4(...),
    O32(...),
    ...;

    public final String name;
    public final double monoIsotopicMass;
    public final double abundancy;

    private Element(String name, double monoIsotopicMass, double abundancy) {
        this.name = name;
        this.monoIsotopicMass = monoIsotopicMass;
        this.abundancy = abundancy;
    }
}

for (Element elem : Element.values()) {
    if (elem.abundancy > 0.5) {
        ...
    }
}

Если вы хотите жестко запрограммировать значения и хотите изменить их, вам нужно перекомпилировать вашу программу, вот в чем проблема. Чтение ваших данных из файла имеет следующие преимущества:

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

Возможно, для вас это не имеет значения; тогда просто продолжайте и поместите свои данные в источник.

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

Если вы хотите таким образом смоделировать вселенную с другим изобилием C12, имея жестко закодированные значения, вам придется перекомпилировать программу.

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

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

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

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

Код Java читается только компилятором Java, в то время как XML читается любым разумным (то есть знающим XML) языком. Кроме того, если вы хотите добавить некоторую ценность, вам не нужно все перекомпилировать.

Лично я бы пошел на жесткое кодирование, если значения не будут изменены никогда, и если приложение маленькое. В противном случае я бы выбрал внешние источники данных conf.

Но каждый раз, когда люди говорят мне, что ценности не изменятся, это в значительной степени означает, что они будут так что подготовка динамических сред-это путь, по которому нужно идти в целом. Файлы XML conf, таблицы базы данных conf и т. д.

Если вы пишете их в XML, вы можете использовать разные значения для разных устройств., например, предположим, что у вас есть размер с именем item_margin, и он должен отличаться в зависимости от ширины устройства, поэтому в values/dimens.xml у вас есть этот

<dimen name="item_margin">0dp</dimen>

И в устройствах, которые имеют ширину min 600dp, вы хотите, чтобы это поле было 60dp , поэтому в значения-sw600dp/dimens.xml у вас есть это

<dimen name="item_margin">60dp</dimen>

Таким образом, эти значения автоматически выбираются в зависимости от ширины устройства, поэтому вам не нужно проверять ширина устройства и выберите соответствующее значение в коде Java

Comments

    Ничего не найдено.