0

有没有办法在编译时创建 Map 或 Set 类型的数据结构?

我问这个的原因是因为我正在使用 App Engine,并且我有一些需要排序和搜索的数据结构,但它们是不变的,所以我想避免在开始时创建它们的时间成本 -向上。

4

4 回答 4

3

与任何类型的性能优化一样,首先要问自己的是在运行时设置这些结构所花费的时间是否真的会影响性能。你的结构有多大面积?他们需要多长时间才能建立起来?如果您还没有衡量这一点,那么您正在从事过早的优化,正如我们所知,这是万恶之源。

假设你已经这样做了,那么让我们看看选项。你能真正节省多少时间?你最好的选择是使用某种形式的序列化,但你必须自己写;即使您定义了一种文件格式来保存内容,也必须解析文件,并且必须创建内存中的数据结构。这需要时间,而且它不可能比仅仅创建地图或集合并填充它们快得多。在某些语言中,理论上您可以为这些结构保存内存的位模式,但即使您可以这样做,您也会使自己容易受到编译器版本的任何微小变化的影响,并且您所犯的任何错误几乎都无法调试。

简而言之,除非您确定需要,否则不要这样做。即使那样,您可能也不应该这样做。您唯一应该考虑的时间是(可能非常少)节省的时间绝对意味着项目成功与失败之间的差异。

于 2010-11-02T15:52:59.613 回答
2

如果您使用 Spring,您可以在配置中创建和填充这些数据结构并缓存它们,但我看不出如何避免在运行时创建和填充它们。您必须在某个时候运行该代码。对我来说,这听起来像是过早的优化。

于 2010-11-02T15:34:31.063 回答
1

在编译时,我认为这是不可能的。在运行时是可能的。您最好的解决方案是使用应用程序引擎,并且可能使用 cron 作业技巧来保持其热门cron 作业链接

然后您可以在静态代码块中定义列表,该代码块将在应用程序的首次运行时缓存

例如

private static List<Object> list = new ArrayList<Object>();

static {
    for(Value value : getValues()){
        list.add(value);
    }
}

另请参阅post 构造的spring 注释,以便您可以在非静态环境中执行相同操作,方法是使用 @PostConstruct 注释方法,该方法将在创建对象时执行。

于 2010-11-02T15:40:54.703 回答
1

不; 所有对象的创建总是在运行时发生。

话虽如此,您可以像这样一起声明和初始化 Sets:

private static Set<String> set = new HashSet<String>(Arrays.asList("abc", "def"));

不过,这仍将在运行时执行。

要处理地图,您必须改用静态初始化程序。

于 2010-11-02T15:47:12.243 回答