有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Java长包装器与原始长包装器添加数字的性能比较

我正在运行这段代码,并得到了意想不到的结果。我预计添加原语的循环将执行得更快,但结果并不一致

import java.util.*;

public class Main {
    public static void main(String[] args) {
        StringBuilder output = new StringBuilder();
        long start = System.currentTimeMillis();
        long limit = 1000000000; //10^9
        long value = 0;
        for(long i = 0; i < limit; ++i){}
        long i;
        output.append("Base time\n");
        output.append(System.currentTimeMillis() - start + "ms\n");
        start = System.currentTimeMillis();
        for(long j = 0; j < limit; ++j) {
            value = value + j;
        }
        output.append("Using longs\n");
        output.append(System.currentTimeMillis() - start + "ms\n");
        start = System.currentTimeMillis();
        value = 0;
        for(long k = 0; k < limit; ++k) {
            value = value + (new Long(k));
        }
        output.append("Using Longs\n");
        output.append(System.currentTimeMillis() - start + "ms\n");
        System.out.print(output);
    }
}

输出:

基准时间 359毫秒 使用long 1842毫秒 使用long 614ms

我试过在它自己的java程序中运行每个单独的测试,但结果是一样的。是什么原因造成的

小细节:运行java 1.6

编辑: 我让另外两个人试用这个代码,其中一个人得到了和我一样的奇怪结果。另一个得到了真正有意义的结果!我让那个成绩正常的人给我们他的班级二进制文件。我们运行它,仍然会得到奇怪的结果。问题不在编译时(我认为)。我在运行1.6.0_31,得到正常结果的人在1.6.0_16,得到像我一样奇怪结果的人在1.7.0_04

编辑:使用线程获得相同的结果。在节目开始时睡觉(5000)。在整个程序中进行while循环也可以得到同样的结果(看看java完全启动后时间是否会收敛到正常时间)


共 (0) 个答案