Java:计算数组排序所需的时间
我有一些代码可以在一个数组中生成1000个数字,然后对它们进行排序:Java:计算数组排序所需的时间,java,arrays,sorting,timer,Java,Arrays,Sorting,Timer,我有一些代码可以在一个数组中生成1000个数字,然后对它们进行排序: import java.util.Arrays; import java.util.Random; public class OppgA { public static void main(String[] args) { int[] anArray; anArray = new int[1000]; Random generator = new Random();
import java.util.Arrays;
import java.util.Random;
public class OppgA {
public static void main(String[] args) {
int[] anArray;
anArray = new int[1000];
Random generator = new Random();
for(int i=0; i<1000; i++){
anArray[i] = (generator.nextInt(1000)+1);
}
Arrays.sort(anArray);
System.out.println(Arrays.toString(anArray));
}
}
导入java.util.array;
导入java.util.Random;
公开课{
公共静态void main(字符串[]args){
国际[]无秩序;
anArray=新整数[1000];
随机生成器=新随机();
对于排序前的(int i=0;i),声明一个与开始排序前的时间相对应的long:
long timeStarted = System.currentTimeMillis();
//your sorting here.
//after sorting
System.out.println("Sorting last for:" + (System.currentTimeMillis() - timeStarted));
结果将返回与排序相同的毫秒数
正如assylias评论的那样,如果您希望精确测量经过的时间,您也可以使用System.nanoTime()
。在开始计算之前,或者在生成数组之后,您可以使用它来获得精确的时间,并在完成排序之后执行相同的操作,然后找到差异。这样做:
long beforeTime = System.currentTimeMillis();
// Your Code
long afterTime = System.currentTimeMillis();
long diffInMilliSeconds = afterTime- beforeTime;
long start=System.currentTimeMillis();
…
您的排序代码
…
long end=System.currentTimeMillis();
long-timeInMillis=end-start;
希望对您有所帮助。您可以在调用Arrays.sort()
前后调用(并存储的结果)-不同之处在于所花费的时间(以纳秒为单位)。在计算持续时间时,该方法优于System.currentTimeMillis
long start = System.nanoTime();
Arrays.sort(anArray);
long end = System.nanoTime();
long timeInMillis = TimeUnit.MILLISECONDS.convert(end - start, TimeUnit.NANOSECONDS);
System.out.println("Time spend in ms: " + timeInMillis);
但是请注意,如果您多次运行该程序,测量结果可能会有很大的差异。要获得更精确的计算,需要更多的参与-例如,请参阅:。import java.util.Arrays;
导入java.util.Random;
公开课{
公共静态void main(字符串[]args){
国际[]无秩序;
anArray=新整数[1000];
随机生成器=新随机();
对于(int i=0;i适当的微基准标记是使用现成的工具完成的,如谷歌卡钳或Oracle jmh。但是,如果您想要穷人版,请至少遵循以下几点:
使用System.nanoTime()
(如其他地方所述)进行测量。不要相信小的数字:如果获得10微秒这样的计时,则表示测量的时间跨度太短。请放大阵列,使其至少达到毫秒
多次重复排序过程(可能是10100次),并显示每次尝试的时间。在前几次运行后,您预计会看到时间明显下降,但在这之后,时间应该会稳定下来。如果您仍然观察到野生变化,您就知道出了问题
为了避免垃圾收集问题,请重用相同的数组,但每次都用新的随机数据重新填充它
这不是一个理想的方法,但这会起作用
long startingTime=System.currentTimeMillis();
Arrays.sort(anArray);
long endTime=System.currentTimeMillis();
System.out.println("Sorting time: "+(endTime-startingTime)+"ms");
以下可能是最好的方法
long startingTime=System.nanoTime();
Arrays.sort(anArray);
long endTime=System.nanoTime();
System.out.println("Sorting time: "+(endTime-startingTime)+"ns");
简而言之,您可以将我们的代码提取到一个方法,然后计算该方法的开始和结束时间戳之间的差异,或者您可以在探查器或IDE中运行它,它将打印执行时间
理想情况下,您不应将业务逻辑(本例中为数组排序)与“度量”内容混为一谈。如果您确实需要测量应用程序内的执行时间,您可以尝试使用AOP进行测量
请参考这篇文章,它非常详细地描述了可能的解决方案System.nanotime优先于System.currentTimeMillis来计算持续时间…+1这是可以添加到代码中的最基本的分析形式…为了获得更好的结果,请尝试更大的数组并对其进行排序…这将更好地了解计算机的运行速度java正在对数据进行排序。如果您认为nanoTime
给出了一个“非常准确”的值,那么您就错了结果。名称有误导性:currentTimeMillis
可能会以100分之一秒甚至10分之一秒的粒度报告。nanoTime
本身永远不会超过微秒。你是对的。它应该是精确的,而不是精确的。@assylias:你应该回答这个问题。所有当前的人都使用System.currentTimeMillis(),这不是最佳解决方案。@marounnaroun:确实是::-)@JBNizet-LOL。我没想到..“多次重复排序过程”:并丢弃前N个结果以说明热身。@Thilo个人认为,我是手动执行该步骤的。显示所有结果并手动评估它们。性能提升很容易发现,以及可能发生的任何异常情况。
long startingTime=System.nanoTime();
Arrays.sort(anArray);
long endTime=System.nanoTime();
System.out.println("Sorting time: "+(endTime-startingTime)+"ns");