Java 为什么在搜索循环超过2000次后,我的数组搜索需要0纳秒?

Java 为什么在搜索循环超过2000次后,我的数组搜索需要0纳秒?,java,arrays,loops,Java,Arrays,Loops,我为一个Java类编写了一个程序,用来搜索一个由10个元素组成的字符串数组,寻找一个特定的目标。程序从数组的开始到数组的结束搜索目标,然后从数组的结束到数组的开始搜索。每次搜索都会计时并循环1000次。在每个搜索方法循环1000次之后,将选择最快的搜索方法来搜索数组,以查找我在主方法中作为参数传递的任意数量的“rep” 我遇到的问题是,当我将循环数更改为2000以上时。从大约2100开始,以纳秒为单位搜索阵列所需的时间通常为0。这是因为JVM已经预热,搜索一个10元素数组所需的时间不能用纳秒来衡

我为一个Java类编写了一个程序,用来搜索一个由10个元素组成的字符串数组,寻找一个特定的目标。程序从数组的开始到数组的结束搜索目标,然后从数组的结束到数组的开始搜索。每次搜索都会计时并循环1000次。在每个搜索方法循环1000次之后,将选择最快的搜索方法来搜索数组,以查找我在主方法中作为参数传递的任意数量的“rep”

我遇到的问题是,当我将循环数更改为2000以上时。从大约2100开始,以纳秒为单位搜索阵列所需的时间通常为0。这是因为JVM已经预热,搜索一个10元素数组所需的时间不能用纳秒来衡量吗?我意识到这听起来很傻

我只是将整个程序粘贴到这里以供参考(该程序远未完成,但可以编译和运行):


通常,JVM将使用操作系统提供的最精确的计时器来实现System.nanoTime(),但这通常不精确到纳秒,而不是查询计时器的瞬时值(在我的硬件上,它需要2微秒)。即使是这样,您的程序也不能保证由操作系统独占使用硬件,也就是说,如果另一个进程需要CPU,操作系统可能会暂停您的程序几毫秒,以便让另一个进程有机会运行

因此,如果您想要一个可靠的基准测试,您只能假设计时器精确到几毫秒。典型的解决方法如下所示:

long start = System.nanoTime();
for (int i = 0; i < reps; i++) {
    codeToTest();
}
long end = System.nanoTime();
System.out.println((end - start) / reps + " ns");
long start=System.nanoTime();
对于(int i=0;i
选择重复次数,使经过的时间适当大


对于一个真正好的基准测试,您还应该考虑即时编译的影响。一个相当全面的列表可以在

即时编译(JIT)中找到。计算机速度快,时钟精度不高。对现代计算机来说,搜索大小为10的数组(因此平均迭代5次)是一项极快的任务。使用数组,比如说100000或1000000个元素。我实际上一点也不认为这是愚蠢的。如果分配未指定要搜索的数组的大小,请尝试将其设置得更大。或者更好的方法是,创建几个循环,然后为每个循环随机选择一个。正如上面其他人所说的,代码运行速度很快。我还要补充一点,nanotime()不是最好的方法。从文档中可以看出:该方法提供纳秒精度,但不一定是纳秒精度。
Backwards: - Target found at index:3 , Time: 453 nanoseconds
Loop #: 9992

Backwards: - Target found at index:3 , Time: 0 nanoseconds
Loop #: 9993

Backwards: - Target found at index:3 , Time: 0 nanoseconds
Loop #: 9994

Backwards: - Target found at index:3 , Time: 0 nanoseconds
Loop #: 9995

Backwards: - Target found at index:3 , Time: 0 nanoseconds
Loop #: 9996

Backwards: - Target found at index:3 , Time: 0 nanoseconds
Loop #: 9997

Backwards: - Target found at index:3 , Time: 0 nanoseconds
Loop #: 9998

Backwards: - Target found at index:3 , Time: 0 nanoseconds
Loop #: 9999

Linear search was faster: 432 times
Reverse linear search was faster: 282 times
Tied: 287 times

Target 'mouse' found at index: 3

Average speed searching array front to end(10000 trials):
Nanoseconds: 167.1195

Average speed searching array end to front(10000 trials):
Nanoseconds: 967.341

Linear search found 'mouse' fastest overall
long start = System.nanoTime();
for (int i = 0; i < reps; i++) {
    codeToTest();
}
long end = System.nanoTime();
System.out.println((end - start) / reps + " ns");