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