小编use*_*922的帖子

我有一个Java性能问题,我不明白

我写了一些代码来制作一个多维数组,而不是一个数组数组,这样我就可以节省一些内存.然后我运行了一些测试,将它的速度与常规Java数组(int [] [])的速度进行比较,因为我不希望程序运行得更慢,即使它节省了一些内存.我在时间测试中看到的让我感到困惑.以下是测试运行的典型结果.时间是相同的代码.注意最后两个比前四个大得多.

时间:58343722 ns
时间:59451156 ns
时间:51374777 ns

时间:61777424 ns
时间:813156695 ns
时间:782140511 ns

现在我想到的第一件事是垃圾收集器踢了什么.我将内存限制提高到5GB(-Xmx5g),这样垃圾收集器就会无法启动.没有改变.我把东西移动了,但模式仍然存在.

那样的模式是什么?在前三次,代码位在一个函数中,我称之为三次.在第二次三次中,代码位在单个函数中重复三次.因此,模式是每当代码位在同一个函数中运行多次时,运行代码位所需的时间将从第二位代码开始,然后保持在那里.

我确实找到了一个可以产生这样结果的改动:

时间:58729424 ns
时间:59965426 ns
时间:51441618 ns

时间:57359741 ns
时间:65362705 ns
时间:857942387 ns

我所做的是在后三个的代码位之间添加一毫秒的延迟.这样做只会加速块中的第二个代码位,并且没有任何延迟会加速其后的任何代码位.

坦率地说,我很困惑.我无法解释这种行为.有人可以了解正在发生的事情吗?

这是代码:

package multidimensionalarraytests;

import java.lang.reflect.Array;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MultidimensionalArrayTests {
    static ArrayInt2Dv1 array=new ArrayInt2Dv1(10000,10000);

    public static void main(String[] args) {
        System.out.println("ignore the warmup");
        test();
        test();
        combined();
        combined();

        System.out.println("running tests");
        test();
        test();
        test();
        System.out.println();
        combined();
    }

    static long test(){
        int value=1;
        long start,stop,time;

        System.out.print("time: ");
        start=System.nanoTime(); …
Run Code Online (Sandbox Code Playgroud)

java performance

13
推荐指数
1
解决办法
394
查看次数

标签 统计

java ×1

performance ×1