存储java程序的只读数据的最有效方法是什么?

时间:2012-01-06 02:02:22

标签: java xml

我有一个我正在尝试编程的游戏,但它的初始数据输入却很大。事情是所有这些数据都是只读的。所以当程序运行时,每次都是一样的。

我需要问这个问题的原因是因为我认为每次运行程序时通过类系统重新运行数据是低效的。最初我使用的是XML设置:

XML设置示例:

<?xml version="1.0"?>
<gameBoard>
    <!-- Area 1 -->
    <area name="Area 1">
        <arrows white="Area 2" black="Area 3" />
        <color>white</color>

        <location name="Area 1 Atrium" />
        <location name="Location 1.1">
            <attr1>foo</attr1>
            <attr2>bar</attr2>
            <attr3>foobar</attr3>
        </location>
        <location name="Location 1.2">
            <attr1>foo</attr1>
            <attr2>bar</attr2>
            <attr3>foobar</attr3>
        </location>
        <location name="Location 1.3">
            <attr1>foo</attr1>
            <attr2>bar</attr2>
            <attr3>foobar</attr3>
        </location>
    </area>
</gameBoard>

我通过JSON或YAML选择了这个,因为每个位置和区域标签的属性都派上用场,而且我最了解XML,我知道它的支持程度有多广。

但是,这是最好的事情吗?每次玩家移动时,我认为它必须遍历此设置以找到玩家想要移动到的特定位置(技术上它不会迭代文档,因为Java的DOM解析器首先将整个文档加载到内存中,但无论如何)。

我的第二个想法是为每个区域创建一个类,每个区域都有一个方法,只需通过方法设置变量(例如,playerLocation将设置为一个位置的名称,这可能很容易完成)。

此外,这些数据绝不是人类可读的。我知道,当数据是字节码时,它通常要快得多,因此也可以。只有程序需要读取它,即使用户要更改XML / WhateverOtherConfig文件,添加内容也会被忽略。

感谢您的耐心等待。如果我需要澄清任何事情,请告诉我。这非常处于阿尔法阶段,我甚至都没有想到我的想法,所以我只是因为我想到它的大部分内容。再次感谢!如果有需要澄清,请告诉我。

3 个答案:

答案 0 :(得分:7)

需要考虑两个级别的优化。

  1. 解析和构建对象图的开销
  2. 从磁盘加载的开销
  3. 首先考虑低开销序列化,例如JSON(正如@Perception所指出的那样),但也许您应该考虑二进制序列化,因为这将加载最快。

    对于第二个考虑使用OS技术,如内存映射文件来帮助您。

    但在所有优化问题中,我必须说 - 首先衡量衡量标准并再次衡量,以确定真正的绩效问题。

答案 1 :(得分:1)

您可以使用直接二进制格式(您自己创建的)或者如果您想要更多灵活性,可以尝试简单地将对象直接序列化到磁盘。这些选项可能提供您所追求的效率。我强调可能因为没有实际的分析器,所以无法100%确定问题所在。

答案 2 :(得分:0)

JSON将是一个不错的选择。我也建议你看看Lua。