我有一个相当昂贵的数组计算(SpectralResponse),我希望将其保持在最低限度。我认为最好的方法是存储它们并在将来再次需要相同阵列时将其恢复。决定是使用BasicParameters进行的。
现在,我使用了一个LinkedList of object作为SpectralResponse的数组,并使用另一个LinkedList作为BasicParameter。 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要慢。慢得多。
所以这是我的实现错了,或者我错了预先计算和查找更快?
答案 0 :(得分:4)
您正在通过索引访问LinkedList,这是访问它的最糟糕方式;)
您应该使用ArrayList,或者对所有列表使用迭代器。
可能你应该将三个对象合并为一个,并将它们保存在一个以responseNum为关键字的地图中。
希望这有帮助!
答案 1 :(得分:1)
您可能应该使用数组类型(实际数组,如Vector,ArrayList),而不是链接列表。链接列表最适合堆栈或队列操作,而不是索引(因为您必须从一端遍历它)。 Vector是一个自动调整大小的数组,在访问不法之时的开销较小。
答案 2 :(得分:1)
LinkedList的get(i)方法要求获取它必须在列表中越走越远的每个项目。考虑使用ArrayList,iterator()方法或仅使用数组。
答案 3 :(得分:0)
第二行'if (responseNumbers.get(i) == responseNum)
'也是效率低的,因为responseNumbers.get(i)
是一个整数,并且必须取消装箱到一个int(Java 5以后会自动执行此操作;您的代码将无法编译如果将responseNum声明为int,则在Java 1.4或更早版本上。有关拳击的更多信息,请参阅this。
要删除此拆箱开销,请使用apache基元库中的IntList。此库包含将基础对象(在您的情况下为整数)存储为基本数组(例如int [])而不是Object数组的集合。这意味着不需要装箱,因为IntList的方法返回原始类型,而不是整数。