我有一段代码需要根据 double 值进行许多计算,这需要太多时间。我可以通过删除一些小数来加快速度吗?如果我使用格式化程序来解析 double ,那不会先进行微积分然后去掉多余的小数,这样一无所获吗?这样做的最佳方法是什么?
只是一些想法:
double avgRatingForPreferredItem = (double) tempAverageRating.get(matrix.get(0).getItemID1())/matrix.size();
double avgRatingForRandomItem = (double) tempAverageRating.get(matrix.get(0).getItemID2())/matrix.size();
double numarator = 0;
for (MatrixColumn matrixCol : matrix) {
numarator += ( matrixCol.getRatingForItemID1() - avgRatingForPreferredItem ) * (matrixCol.getRatingForItemID2() - avgRatingForRandomItem);
}
double numitor = 0;
double numitorStanga = 0;
double numitorDreapta = 0;
for (MatrixColumn matrixCol : matrix) {
numitorStanga += (matrixCol.getRatingForItemID1() - avgRatingForPreferredItem) * (matrixCol.getRatingForItemID1() - avgRatingForPreferredItem);
numitorDreapta += (matrixCol.getRatingForItemID2() - avgRatingForRandomItem) * (matrixCol.getRatingForItemID2() - avgRatingForRandomItem);
}
numitor = Math.sqrt( numitorStanga * numitorDreapta );
double corelare = numarator/numitor;
最佳答案
我认为所涉及的实际值不会产生任何影响。
至少值得尝试减少这里的计算量:
for (MatrixColumn matrixCol : matrix) {
numitorStanga += (matrixCol.getRatingForItemID1() - avgRatingForPreferredItem)
* (matrixCol.getRatingForItemID1() - avgRatingForPreferredItem);
numitorDreapta += (matrixCol.getRatingForItemID2() - avgRatingForRandomItem)
* (matrixCol.getRatingForItemID2() - avgRatingForRandomItem);
}
这取决于 JIT 编译器的智能程度 - 我假设 getRatingforItemID1
和 getRatingforItemID2
只是传递属性 - 但你的代码至少 看起来它在做多余的减法。所以:
for (MatrixColumn matrixCol : matrix) {
double diff1 = matrixCol.getRatingForItemID1() - avgRatingForPreferredItem;
double diff2 = matrixCol.getRatingForItemID2() - avgRatingForPreferredItem;
numitorStanga += diff1 * diff1;
numitorDreapta += diff2 * diff2;
}
您可以尝试将所有内容更改为float
而不是double
- 在某些架构上可能会使事情变得更快;在其他人身上可能不会。
不过,您完全确定是您显示的代码有问题吗?这只是一个复杂度为 O(N) 的算法 - 需要多长时间,矩阵有多大?
关于Java双倍运算速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9052130/