测试遍历整数列表的时间

时间:2013-02-21 02:02:38

标签: java iterator linked-list

我想测试时间,看看显示三百万个数字需要多长时间,但我不知道如何做到这一点。任何想法将不胜感激。

import java.util.*;

public class LinkedListProgram {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        LinkedList<Integer> list = new LinkedList<Integer>();
        Random randomNumbers = new Random();

        System.out.println("Enter number of integers");
        int number = input.nextInt();
        for (int i=0; i < number; i++){
            list.add(randomNumbers.nextInt(100));
        }

        for (Iterator i = list.iterator(); i.hasNext();) {
            Integer integer = (Integer) i.next();
            System.out.println(integer);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我通常使用junit或ngunit来感受运行时。它会告诉你测试在你的ide中与控制台分开运行需要多长时间。

或者您可以像这样记录开始时间和结束时间:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date));

doStuff();

date = new Date();
System.out.println(dateFormat.format(date));

或者您可以记录执行时间:

                    long start = System.currentTimeMillis();
                    System.out.println("Going to call the method.");

                    doStuff();

System.out.println("Method execution completed.");
                    long elapsedTime = System.currentTimeMillis() - start;
                    System.out.println("Method execution time: " + elapsedTime + " milliseconds.");

你可以使用log4j,如果你想在其他地方写(即文件),而不是把它全部混在控制台中

logger.info(dateFormat.format(date);

如果你想变得更加漂亮,你可以使用AOP切入点来记录方法执行的开始和结束时间,例如spring aop。代码来自此处:http://veerasundar.com/blog/2010/01/spring-aop-example-profiling-method-execution-time-tutorial/

@Aspect
public class BusinessProfiler {

        @Pointcut("execution(* com.veerasundar.spring.aop.*.*(..))")
        public void businessMethods() { }

        @Around("businessMethods()")
        public Object profile(ProceedingJoinPoint pjp) throws Throwable {
                long start = System.currentTimeMillis();
                System.out.println("Going to call the method.");
                Object output = pjp.proceed();
                System.out.println("Method execution completed.");
                long elapsedTime = System.currentTimeMillis() - start;
                System.out.println("Method execution time: " + elapsedTime + " milliseconds.");
                return output;
        }

}

打印到控制台可能是一个瓶颈,因为它阻止了io - 你为什么要在控制台上打印这么多?这个测试有价值吗?

答案 1 :(得分:0)

如果您有兴趣检查LinkedList的性能并可能将其与ArrayList或常规数组进行比较,那么您可能希望删除println语句。显示器的输出比在内存中移动数据花费的时间要多得多。

import java.util.*;

public class LinkedListProgram {

 public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    LinkedList<Integer> list = new LinkedList<Integer>();
    Random randomNumbers = new Random();

    System.out.println("Enter number of integers");
    int number = input.nextInt();
    long start = System.currentTimeMillis();
    for (int i=0; i < number; i++){
        list.add(randomNumbers.nextInt(100));
    }
    long generateTime = System.currentTimeMillis();
    int sum=0;
    for (int x : list) {
        sum += x
    }
    long endTime = System.currentTimeMillis();

    System.out.println("Time to gernerate numbers: " +  (generateTime - start) );
    System.out.println("Time to sum list: " +  (endTime  - generateTime) );
  }
}