【发布时间】:2014-07-23 01:52:23
【问题描述】:
我正在研究一种算法,并且一直在成功优化它,直到遇到这个奇怪的问题:
数组 C 作为参数传递给方法。
int lim = C.length;
double A[]=new double[lim];
double B[]=new double[lim];
for (int I = offset; I < lim; I++) {
A[ (int) B[C[I]] ] = C[I];
}
A、B 是 double 数组,C 是整数数组。它们的大小都相同。
当我使用System.nanoTime() 发现时间差异时,我注意到这段代码的运行速度比它应该运行的要慢得多。
通过故障排除,我发现如果我仅将 C[I] 替换为 I 或使用嵌入代码中的值初始化的常量或任何变量,它的运行速度比它的值来自以下来源时快很多倍代码中没有预定义。
作为最后的测试,我用一个随机整数替换了C[I],得到了同样的慢速。怎么了? JVM 是否针对预定义变量优化代码?我可以合理地解决这个问题,而无需在代码中定义我的数组内容(我确信这会解决这个问题)吗?
如果我能解决这个问题,优化将产生一个新的排序算法,该算法的运行速度将比 Java 7 的 QuickSort 算法 实现快得多。对于 n
目前,我已经记录了它(在我的机器上)在 3.8-3.9 秒内对 800 万个数字(双精度类型)进行排序,而 Java 的 QuickSort implementation(Arrays.sort()) 在同一台机器上大约需要 1.53 秒。我已经在 2 个 for 循环中跟踪到这行代码的 2 次发生率,我需要帮助。
【问题讨论】:
-
你为什么要转换成 int 已经是整数的东西?
-
应该是
A[(int)B[C[i]] ] = C[i]? -
如何使用数组 B 中的双精度值来索引数组 A?
-
@gbenroscience 我正在投入时间学习 Java 8 中的 Lambda。我在小样本中使用了 sort 和 sort 与可比性,Lambda 让您有机会在并行模式下执行您想做的事情也是。我通过这个只是为了给你一些想法希望它有帮助
-
感谢@Kick!我会考虑你的建议
标签: java algorithm sorting optimization compiler-optimization