What is more efficient: sorted stream or sorting a list?

后端 未结 3 1970
滥情空心
滥情空心 2021-01-03 21:43

Assume we have some items in a collection and we want to sort them using certain comparator, expecting result in a list:

Collection items = ...;
         


        
3条回答
  •  春和景丽
    2021-01-03 22:06

    Below is my benchmark (not really sure if it is correct):

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeSet;
    import java.util.concurrent.TimeUnit;
    import java.util.stream.Collectors;
    
    import org.openjdk.jmh.annotations.Benchmark;
    import org.openjdk.jmh.annotations.BenchmarkMode;
    import org.openjdk.jmh.annotations.Mode;
    import org.openjdk.jmh.annotations.OperationsPerInvocation;
    import org.openjdk.jmh.annotations.OutputTimeUnit;
    
    @OutputTimeUnit(TimeUnit.NANOSECONDS)
    @BenchmarkMode(Mode.AverageTime)
    @OperationsPerInvocation(MyBenchmark.N)
    public class MyBenchmark {
    
        public static final int N = 50;
    
        public static final int SIZE = 100000;
    
        static List sourceList = new ArrayList<>();
        static {
            System.out.println("Generating the list");
            for (int i = 0; i < SIZE; i++) {
                sourceList.add(i);
            }
            System.out.println("Shuffling the list.");
            Collections.shuffle(sourceList);
        }
    
        @Benchmark
        public List sortingList() {
            List sortedList = new ArrayList<>(sourceList);
            Collections.sort(sortedList);
            return sortedList;
        }
    
        @Benchmark
        public List sortedStream() {
            List sortedList = sourceList.stream().sorted().collect(Collectors.toList());
            return sortedList;
        }
    
        @Benchmark
        public List treeSet() {
            Set sortedSet = new TreeSet<>(sourceList);
            List sortedList = new ArrayList<>(sortedSet);
            return sortedList;
        }
    }
    

    Results:

    Benchmark                 Mode  Cnt       Score       Error  Units
    MyBenchmark.sortedStream  avgt  200  300691.436 ± 15894.717  ns/op
    MyBenchmark.sortingList   avgt  200  262704.939 ±  5073.915  ns/op
    MyBenchmark.treeSet       avgt  200  856577.553 ± 49296.565  ns/op
    

    As in @Eugene's benchmark, sorting list is slightly (ca. 20%) faster than sorted stream. What surprizes me a bit is that treeSet is significantly slower. I did not expect that.

提交回复
热议问题