Java 为什么我的循环输出两个不同的结果?
我需要以下代码的帮助。在通过该循环迭代一个随机数组userArray\u Copy之后,前两个纳秒的结果与其余结果一致不同。我不知道为什么。 下面是一个pastebin文件的完整代码。 我已经在这个问题上纠缠了好几个小时了,任何和所有的帮助都将不胜感激Java 为什么我的循环输出两个不同的结果?,java,arrays,loops,sorting,iteration,Java,Arrays,Loops,Sorting,Iteration,我需要以下代码的帮助。在通过该循环迭代一个随机数组userArray\u Copy之后,前两个纳秒的结果与其余结果一致不同。我不知道为什么。 下面是一个pastebin文件的完整代码。 我已经在这个问题上纠缠了好几个小时了,任何和所有的帮助都将不胜感激 do{ //Resetting array and time for(int i = 0;i<n;i++){ userArray_Copy[i] = userArray[i]; } stopwatch.reset
do{
//Resetting array and time
for(int i = 0;i<n;i++){
userArray_Copy[i] = userArray[i];
}
stopwatch.reset();
elapsedTime = 0;
stopwatch.start();
bubbleSort(userArray_Copy, n);
stopwatch.stop();
elapsedTime = stopwatch.getElapsedTime();
stopwatch.reset();
System.out.println("\nSORTED ARRAY");
for(int i = 0;i<n;i++){
System.out.print(userArray_Copy[i]+" ");
}
System.out.println("\nTime taken in nanoseconds: "+elapsedTime+"\n\nRun Algorithm against unsorted array again?[Y/N]");
char A = reader.next().charAt(0);
if(A == ('y')||(A == 'Y')){
runAgain=true;
}
else {
runAgain=false;
System.out.println("Average time of sorting algorithm: "+stopwatch.getElapsedTime()+"\nNumber of algorithms completed: "+AverageRuns);
}
}while(runAgain);
因为java
这不是java中计时的方式
使用java中的to time代码
下面是可能发生的情况*:Java在开箱即用的情况下运行代码的速度非常慢:它只是解释字节码(这并不比Java源代码高效多少),并花费大量额外的时间在这些运行上做一些基本的簿记来引导
这是因为这是不相关的:对于绝大多数应用程序,99%的CPU和内存资源被1%的代码库占用。如果你能优化这1%,那么这个应用程序的速度会非常快。所以1%才是最重要的,而优化这一点才是最重要的
这正是java所做的:一旦它意识到(通过我提到的簿记)这个虚拟机的大部分时间都花在排序代码上,它就会冻结代码一段时间,使用它广泛的簿记来记录分支趋向于哪条路,哪些条件似乎总是保持不变,etc–生成高度调优的专门分支预测优化的机器代码。一旦完成,它将使用这个高度优化的版本。至少,在烘焙到代码中的一个看似总是正确的先决条件不再正确(在这种情况下,优化的代码无效)之前,java会回到缓慢解释的方式,直到再次生成优化版本
*)这只是java优化和以不同方式运行的众多方式之一。从垃圾收集到热点编译,有很多方法可以这样修改运行时。我甚至把上面的内容过于简单化了 因此,在每次传递的第二次,我都会通过冒泡排序算法。毫无疑问,只有第二次是关闭的?
static void bubbleSort(int[] userArray_Copy, int n) {
int temp;
for (int i = 0;i<n;i++)
for (int j = 0 ; j < n-1 ; j++)
{
if ( userArray_Copy[j] > userArray_Copy[j+1] )
{
temp = userArray_Copy[j];
userArray_Copy[j] = userArray_Copy[j+1];
userArray_Copy[j+1] = temp;
}
}
}
public class StopWatch
{
private long elapsedTime;
private long startTime;
private boolean isRunning;
public StopWatch()
{
reset();
}
public void start()
{
if (isRunning)
return;
isRunning = true;
startTime = System.nanoTime();
}
public void stop()
{
if(!isRunning)
return;
isRunning = false;
long endTime = System.nanoTime();
elapsedTime = endTime-startTime;
}
public long getElapsedTime()
{
if(isRunning)
{
long endTime = System.nanoTime();
elapsedTime = (endTime-startTime);
return elapsedTime;
}
else
return elapsedTime;
}
public void reset()
{
elapsedTime = 0;
isRunning = false;
}
}