2

这是一个关于硬编码数据效率的一般问题——我正在用 Java 编写一个程序来进行一些化学分析,我需要使用不同元素的同位素丰度。我现在设置它的方式是所有值(永远不需要修改)都存储为我的类中的最终字段,即

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

许多类似的程序将此类数据存储在 XML 文件中,然后从那里读取值,如下所示:

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

是否有任何理由(性能、内存等)以这种方式读取它?将其保留为字段似乎更容易。

4

8 回答 8

2

硬编码在性能和内存分配方面要快得多。

从文件中读取的好处是代码的可重用性(使用不同的参数运行程序而无需重新编译它)。

请注意,从文件中读取有以下步骤:

  1. 声明用于存储值的变量。
  2. 创建输入(流)对象
  3. 用路径初始化它
  4. 从 FS 打开文件
  5. 找到要读取的正确行
  6. 读取值
  7. 将其存储在上面的变量中
  8. 关闭输入(流)

这是一个相当大的开销,而不是有一个带有值的预编译最终变量

于 2013-07-25T13:23:29.617 回答
2

由于这些是真正的通用常量,属性数量有限,您可以将它们放入代码中,但组织得很好。

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) {
        ...
    }
}
于 2013-07-25T13:37:27.380 回答
1

如果你想硬编码这些值并想改变它们,你必须重新编译你的程序,这就是问题所在。从文件中读取数据有以下好处:

  • 您不必等待程序为数据的每次更改重新编译。对于一个相当大的程序,这可能需要一些时间。
  • 您的用户甚至无需访问源即可更改数据。
  • 您可以拥有不同的数据集,只需更改配置文件名即可在这些数据集之间切换。

也许这些对你来说都无关紧要;然后继续将您的数据放入源中。

性能本身(如程序的性能)从来都不是问题,除非您的分析器这么说。但是我看不出在启动时读取数据文件一小部分数据可能是一个漫长的过程,所以我很确定你不会看到差异。

于 2013-07-25T13:23:39.460 回答
1

如果你想模拟一个具有不同 C12 丰度的宇宙,对这些值进行硬编码意味着你必须重新编译程序。

也可能有其他原因:如果从外部文件读取值,该文件用作文档,外部文件可能更容易检查错误,可能有工具生成文件或将其用于除运行之外的其他目的你的程序,...

于 2013-07-25T13:26:08.217 回答
0

一个配置文件保存属性,一般来说这些属性是随时间变化的。我相信在你的情况下,根据定义,这些是固定的,永远不会改变。
出于这个原因,我会做尽可能简单的事情,即将它们作为字段。

这不是性能问题,只要性能不成为问题,这只是代码库中更容易使用的问题。

我建议您将类中的这些值提取为常量,以便您始终可以导入它来访问这些值。

于 2013-07-25T13:22:39.793 回答
0

Java 代码只能由 Java 编译器读取,而 XML 可由任何合理的(即 XML 感知的)语言读取。此外,如果您想增加一些价值,您不必重新编译所有内容。

于 2013-07-25T13:22:51.257 回答
0

如果值永远不会改变并且应用程序很小,我个人会选择硬编码。否则我会选择 conf 数据的外部来源。

但每次人们告诉我价值观不会改变时,这几乎意味着他们会改变,所以准备动态环境是一般要走的路。XML conf 文件、数据库 conf 表等。

于 2013-07-25T13:23:00.853 回答
0

如果你用 XML 编写它们,你可以为不同的设备使用不同的值,例如假设你有一个带名称的维度,item_margin它需要根据设备的宽度而有所不同,所以values/dimens.xml你有这个

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

在具有最小600dp宽度的设备中,您希望此边距为60dp,因此在 values-sw600dp/dimens.xml 中您有这个

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

这样,这些值会根据设备宽度自动选择,因此您不必检查设备宽度并在 Java 代码中选择适当的值

于 2013-07-25T13:24:17.993 回答