我需要以下代码的帮助。通过此循环迭代随机数组userArray_Copy之后,纳秒的前两个结果与其余结果始终是不同的。我不知道为什么。 这是通过pastebin文件的完整代码。 https://pastebin.com/S2YWp8Gh 我已经在这个问题上停留了几个小时,任何帮助都将不胜感激。
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);
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;
}
}
答案 0 :(得分:1)
因为Java。
这不是在Java中计时的方式。
使用JMH framework来计时Java代码。
这是可能发生的情况*:Java开箱即用地运行代码非常慢:它只是解释字节码(这不比Java源代码有效得多),并花了很多额外的时间来做一些基本的记账工作。这些会启动。
这是因为这无关紧要:对于绝大多数应用程序,99%的CPU和内存资源被1%的代码库占用。如果您可以优化该1%,则该应用程序的运行速度非常快。因此,只有1%才是最重要的,而对它进行优化就是最重要的。
这正是java的作用:一旦意识到(通过我提到的簿记),该VM的大部分时间都花在了这种排序代码上,它将冻结代码一点,使用它的大量簿记来分支倾向于走哪条路,似乎总是保持什么条件,等等–产生高度调整的,专门分支预测的,经过优化编写的优化机器代码。完成后,它将使用此高度优化的版本。至少,直到烘焙到代码中的看似永远正确的先决条件之一不再成立,在这种情况下,优化的代码无效,java才会退回到慢速的解释方式,直到再次生成一个优化版本。
*)这只是Java优化和以不同方式运行的众多方式之一。从垃圾回收到热点编译,有很多方法可以修改运行时,例如:我什至把上面的事情简化了!