我对Java中的功率计算方式以及可用方法的性能感到好奇。所以我写了一个简单的测试来检查Math.pow()
,*
和^
操作。
public static void main(String[] args) {
int SIZE = 100000000;
int[] arr1 = new int[SIZE];
long st1, end1, st2, end2, st3, end3;
st1 = System.currentTimeMillis();
for (int i = 0; i < SIZE; i++) {
arr1[i] = (int) Math.pow(i, 4);
}
end1 = System.currentTimeMillis();
System.out.println("pow: " + (end1 - st1));
arr1 = new int[SIZE];
st2 = System.currentTimeMillis();
for (int i = 0; i < SIZE; i++) {
arr1[i] = i * i * i * i;
}
end2 = System.currentTimeMillis();
System.out.println("mul: " + (end2 - st2));
arr1 = new int[SIZE];
st3 = System.currentTimeMillis();
for (int i = 0; i < SIZE; i++) {
arr1[i] = i^4;
}
end3 = System.currentTimeMillis();
System.out.println(" ^: " + (end3 - st3));
//to prevent optimizations form skipping the calculations
for (int i = 0; i < SIZE; i++) {
if (arr1[i] == 1){
System.out.println(1);
}
}
System.out.println("done");
}
如果前两个结果非常令人期待:
pow: 19253 19128 19205 19145 19185 19130 19162 19177 19191 19157 | 19173
mul: 91 86 91 85 98 90 90 105 87 95 | 92
^: 80 85 80 70 60 65 75 60 70 60 | 71
第三个有点令人困惑。为什么^
总是比简单乘法快一点,应该使用哪一个?
所有测试均在类似条件下使用JRE 1.7进行。
答案 0 :(得分:9)
^
运算符未执行取幂 - 它是一个按位“异或”(又名“xor”)。
使用整数数学将100000000提升到四次幂会得到不正确的结果 - 一个32位整数不能存储那么大的数字。
Math.pow()
将使用浮点运算。由于精度问题,答案可能不是100%准确,但应能够表示所需的结果范围。
要获得大数字的100%准确值,您应该使用BigInteger
类。然而,它不会特别快。这是在考虑准确性与性能时必须做出的权衡。
答案 1 :(得分:4)
Java中的^
运算符是按位异或(),并且定义为与幂函数不相似。
<强>参考强>