Java双倍运算速度

标签 java performance double

我有一段代码需要根据 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 编译器的智能程度 - 我假设 getRatingforItemID1getRatingforItemID2 只是传递属性 - 但你的代码至少 看起来它在做多余的减法。所以:

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/

相关文章:

performance - 哪个循环更快,while 还是 for?

c++ - Sum C++ 返回的垃圾值

java - 将一百万个数字从 java 传递到 matlab?

C++将字符串精确地转换为 double

java - SimpleDateFormat 在日期格式期间错误地向前滚动一年

java - 我可以强制 jetty *不*包含用于单元测试的 Content-Length header 吗?

jquery - 除了 prev() 之外,如何使用多个 jquery 选择器?

performance - Matlab的Get Property函数导致性能问题

java - 如何使用多个 OR 动态构建 booleanbuilder 条件

c# - 类变量是 UML 聚合吗?