Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当执行时间较长时,nanoTime()显示的差异太小_Java - Fatal编程技术网

Java 当执行时间较长时,nanoTime()显示的差异太小

Java 当执行时间较长时,nanoTime()显示的差异太小,java,Java,我试图收集有关执行时间的数据,并比较堆树与bst的排队和退队时间。对于经过的时间,我使用nanoTime 在对堆树(未排序和已排序)进行排队/出列时,随着时间的推移,一切看起来都很好。当我试图将一个包含700000个元素的排序后的bst移出队列时,执行会花费很长时间。这是好的,它类似于排队排序的bst 问题是执行所用的时间不正确。时间应该是15000毫秒左右,但我得到的答案大约是0,5毫秒或459053纳秒 首先,我让一个包含640000个整数元素的bst排队,然后对树进行排序。我感兴趣的是,当

我试图收集有关执行时间的数据,并比较堆树与bst的排队和退队时间。对于经过的时间,我使用nanoTime

在对堆树(未排序和已排序)进行排队/出列时,随着时间的推移,一切看起来都很好。当我试图将一个包含700000个元素的排序后的bst移出队列时,执行会花费很长时间。这是好的,它类似于排队排序的bst

问题是执行所用的时间不正确。时间应该是15000毫秒左右,但我得到的答案大约是0,5毫秒或459053纳秒


首先,我让一个包含640000个整数元素的bst排队,然后对树进行排序。我感兴趣的是,当这个bst已经有640000个排序元素排队时的执行时间

以下是我的代码部分:

public static void main(String[] args)
            throws DuplicateItemException, FileNotFoundException, IOException, EmptyQueueException {

        final String pathFullList = "Files/data_640000.txt";
        final String pathPartialList = "Files/data_6400.txt";
        final int SIZE_SEVEN = 640000;
        final int SIZE_FOR_LIST_TWO = 6400;

        BSTPriorityQueue<Integer> bstQueue = new BSTPriorityQueue<Integer>();
        bstQueue.clear();

        List<Integer> listOne = new ArrayList<Integer>();
        listOne = loadList(pathFullList, SIZE_SEVEN);

        Collections.sort(listOne);
        long execTimeForSort = System.nanoTime() - t2;
        System.out.println("Time for sort: " + execTimeForSort);

        enqueueBstTree(listOne, bstQueue);
        System.out.println("Size of hptree before enqueue: " + hPQueue.size() + 
                "\n" + "Size of bsttree before enqueue: " + bstQueue.size());

        List<Integer> listTwo = new ArrayList<Integer>();
        listTwo = loadList(pathPartialList, SIZE_FOR_LIST_TWO);

        long t1 = System.nanoTime();
        dequeueBstTree(listTwo, bstQueue, SIZE_FOR_LIST_TWO);
        long execTime = System.nanoTime() - t1;

        System.out.println("Time difference for enqueue/dequeue: " + execTime);
        System.out.println("Size of hptree after enqueue/dequeue: " + hPQueue.size() + 
                "\n" + "Size of bsttree after enqueue/dequeue: " + bstQueue.size());
    }
执行此代码可能需要20分钟。我从execTime得到的答案是459053纳秒。

您的系统。纳秒的使用是正确的,但是execTime是为dequeueBstTree方法调用测量的。如果整个程序执行需要20分钟,那么大部分时间都花在测量的dequeuebstree方法调用之外。它可以是任何东西:JVM启动、堆大小调整、GC循环、其他主要逻辑

您最可能想做的是只为dequeueBstTree编写。

您的System.nanoTime使用是正确的,但是execTime仅为dequeueBstTree方法调用测量。如果整个程序执行需要20分钟,那么大部分时间都花在测量的dequeuebstree方法调用之外。它可以是任何东西:JVM启动、堆大小调整、GC循环、其他主要逻辑


您最可能想做的是只为DequeueBStree编写。

您是否尝试过使用System.currentTimeMillis?这种方法更准确,尽管不太准确precise@lucasvwcurrentTimeMillis肯定不是更精确,调用它更便宜,但在大多数情况下,它的粒度较低,并且根据所使用的操作系统功能在内核之间漂移。您是如何计算出应该是15秒的时间的?如果这是程序运行所需的时间,那么很可能是另一个步骤占用了该时间,并且出列持续时间是准确的。我感兴趣的是当将此bst排队时的执行时间。您的程序似乎不包含为enqueueBstTree方法计时的代码。应该是大约15分钟,大约对已排序的二叉搜索树进行排队。我猜你在这个组合中遇到了最坏的情况。当调用dequeueBstTree方法计算每个案例所用的时间时,我是这样做的。您尝试过使用System.currentTimeMillis吗?这种方法更准确,尽管不太准确precise@lucasvwcurrentTimeMillis肯定不是更精确,调用它更便宜,但在大多数情况下,它的粒度较低,并且根据所使用的操作系统功能在内核之间漂移。您是如何计算出应该是15秒的时间的?如果这是程序运行所需的时间,那么很可能是另一个步骤占用了该时间,并且出列持续时间是准确的。我感兴趣的是当将此bst排队时的执行时间。您的程序似乎不包含为enqueueBstTree方法计时的代码。应该是大约15分钟,大约对已排序的二叉搜索树进行排队。我猜你在这个组合中遇到了最坏的情况。当调用dequeueBstTree方法计算每个案例所经过的时间时,我是这样做的。谢谢你的回答。我将尝试为dequeuebstree编写一个正确的microbenhmark。然而,我甚至对代码中的其他主题(如排序)进行了execTime测试。例如,我对排序的评估时间进行了测试,结果立即显示,评估时间比dequeueBstTree的评估时间长约20分钟。但是,正如我所说,我将尝试您提出的解决方案。再次感谢,谢谢你的回答。我将尝试为dequeuebstree编写一个正确的microbenhmark。然而,我甚至对代码中的其他主题(如排序)进行了execTime测试。例如,我对排序的评估时间进行了测试,结果立即显示,评估时间比dequeueBstTree的评估时间长约20分钟。但是,正如我所说,我将尝试您提出的解决方案。再次感谢你。