1

我有一个相当昂贵的数组计算(SpectralResponse),我希望将其保持在最低限度。我认为最好的方法是存储它们并在将来再次需要相同的阵列时将其恢复。使用 BasicParameters 做出决定。

所以现在,我为 SpectralResponse 的数组使用对象的 LinkedList,为 BasicParameter 使用另一个 LinkedList。并且 BasicParameters 有一个 isParamsEqualTo(BasicParameters) 方法来比较参数集。

LinkedList<SpectralResponse> responses
LinkedList<BasicParameters> fitParams
LinkedList<Integer> responseNumbers

所以要查找,我只是通过 BasicParameters 列表,检查匹配,如果匹配,则返回 SpectralResponse。如果不匹配,则计算 SpectralResponse。

这是我用来查找的 for 循环。

size: LinkedList size, limited to a reasonable value
responseNumber: just another variable to distinguish the SpectralResponse.

    for ( i = size-1; i > 0 ; i--) {
        if (responseNumbers.get(i) == responseNum)
        {
            tempFit = fitParams.get(i);
            if (tempFit.isParamsEqualTo(fit))
            {
                return responses.get(i);
            }
        }
    }

但不知何故,这样做不仅会占用大量内存,而且实际上比直接计算 SpectralResponse 慢。慢得多。

所以是我的实现错了,还是我误以为预先计算和查找更快?

4

4 回答 4

4

您正在按索引访问 LinkedList,这是访问它的最糟糕的方法;)

您应该改用 ArrayList,或者对所有列表使用迭代器。

可能您应该将三个对象合并为一个,并将它们保存在以 responseNum 为键的映射中。

希望这可以帮助!

于 2008-12-11T09:01:57.237 回答
1

您可能应该使用数组类型(实际的数组,如 Vector、ArrayList),而不是链接列表。链表最适合堆栈或队列操作,而不是索引(因为您必须从一端遍历它)。Vector 是一个自动调整大小的数组,访问 inexes 的开销更少。

于 2008-12-11T09:03:53.833 回答
1

LinkedList 的 get(i) 方法要求获取每个项目,它必须沿着列表越来越远。考虑使用 ArrayList、iterator() 方法或仅使用数组。

于 2008-12-11T09:06:12.563 回答
0

第二行 ' if (responseNumbers.get(i) == responseNum)' 也将是低效的,因为它responseNumbers.get(i)是一个整数,并且必须将其拆箱为一个 int(Java 5 及更高版本会自动执行此操作;如果 responseNum 被声明为一个 int,您的代码将不会在 Java 1.4 或更早版本上编译)。有关拳击的更多信息,请参阅此内容。

要消除此拆箱开销,请使用 apache 原语库中的IntList。该库包含将基础对象(在您的情况下为整数)存储为原始数组(例如 int[])而不是对象数组的集合。这意味着不需要装箱,因为 IntList 的方法返回原始类型,而不是整数。

于 2008-12-17T22:11:55.117 回答