Trying to figure out what method serves best in java to get the maximum timestamp out of a list I setup a small benchmark to evaluate the runtime of Java Streams, collections and an ordinary for loop. My setup can be seen in the following listing.
public static void main(final String[] args) { List list = new ArrayList(); Random rnd = new Random(); for (int i = 0; i < 10; i++) { list.add(rnd.nextInt(10000)); } long t1 = System.currentTimeMillis(); long largestNumber = 0; for (Integer t : list) { if (t > largestNumber) { largestNumber = t; } } long t2 = System.currentTimeMillis(); System.out.println("Max (loop) is " + largestNumber + " in " + (t2 - t1) + " ms."); long t3 = System.currentTimeMillis(); OptionalInt max = list.stream().mapToInt(Integer::intValue).max(); long t4 = System.currentTimeMillis(); if (max.isPresent()) { System.out.println("Max (Stream) is " + max.getAsInt() + " in " + (t4 - t3) + " ms."); } long t5 = System.currentTimeMillis(); int collMax = Collections.max(list); long t6 = System.currentTimeMillis(); System.out.println("Max (Collections) is " + collMax + " in " + (t6 - t5) + " ms."); } |
Here are the results:
Samples | Steams | Collections | Loop |
---|---|---|---|
10.000 | 68 | 3 | 3 |
50.000 | 70 | 5 | 4 |
100.000 | 71 | 6 | 5 |
500.000 | 76 | 16 | 10 |
1.000.000 | 108 | 18 | 12 |
1.500.000 | 89 | 20 | 17 |
5.000.000 | 94 | 29 | 19 |
10.000.000 | 103 | 41 | 30 |
The expected linear runtime allows a comparision of these three ways. Although, collections and streams look way better than the loop runtime shows that it still seems to be the fastest way to determine a max value from values in a simple list.