Advertisement
enfiskutensykkel

Collect

Aug 27th, 2019
542
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.28 KB | None | 0 0
  1. import java.util.List;
  2. import java.util.ArrayList;
  3. import java.util.LinkedList;
  4. import java.util.stream.Collectors;
  5. import java.util.stream.LongStream;
  6. import java.util.function.Function;
  7. import java.util.Arrays;
  8.  
  9. class Stream
  10. {
  11.     static List<Integer> forLoopA(List<String> strings)
  12.     {
  13.         List<Integer> list = new ArrayList<Integer>(strings.size());
  14.         for (String s: strings) {
  15.             int i = Integer.valueOf(s);
  16.             if (i % 2 == 0) {
  17.                 list.add(i);
  18.             }
  19.         }
  20.         return list;
  21.     }
  22.  
  23.     static List<Integer> forLoopL(List<String> strings)
  24.     {
  25.         List<Integer> list = new LinkedList<Integer>();
  26.         for (String s: strings) {
  27.             int i = Integer.valueOf(s);
  28.             if (i % 2 == 0) {
  29.                 list.add(i);
  30.             }
  31.         }
  32.         return list;
  33.     }
  34.  
  35.     static List<Integer> collect(List<String> strings)
  36.     {
  37.         List<Integer> list = strings.stream()
  38.             .map(Integer::valueOf)
  39.             .filter(i -> i % 2 == 0)
  40.             .collect(Collectors.toCollection(ArrayList::new));
  41.         return list;
  42.     }
  43.  
  44.     static List<Integer> existing(List<String> strings)
  45.     {
  46.         List<Integer> list = new ArrayList<Integer>(strings.size());
  47.         strings.stream()
  48.             .map(Integer::valueOf)
  49.             .filter(i -> i % 2 == 0)
  50.             .forEach(n -> list.add(n));
  51.         return list;
  52.     }
  53.  
  54.     static void stats(long[] times, String name)
  55.     {
  56.         double percentiles[] = {99, 97.5, 95, 90, 80, 75, 50, 25, 20, 10, 5, 1};
  57.         Arrays.sort(times);
  58.  
  59.         System.out.println();
  60.         System.out.println(name + " t=" + LongStream.of(times).sum() + ":");
  61.         System.out.println("\tmax=" + times[times.length-1]);
  62.         for (double p: percentiles) {
  63.             long result = 0;
  64.             double idx = (p / 100.0) * times.length;
  65.             if (Math.floor(idx) == idx) {
  66.                 result = (times[(int) idx - 1] + times[(int) idx]) / 2;
  67.             } else {
  68.                 result = times[(int) Math.floor(idx)];
  69.             }
  70.             System.out.printf("\t.%02.0f=%d", p, result);
  71.             System.out.println();
  72.         }
  73.         System.out.println("\tmin=" + times[0]);
  74.     }
  75.  
  76.     static long[] benchmark(Function<List<String>, List<Integer>> func, List<String> list, int repeat, String name)
  77.     {
  78.         System.err.print(name + "...");
  79.         long times[] = new long[repeat];
  80.         long before = System.currentTimeMillis();
  81.         for (int i = 0; i < repeat; ++i) {
  82.             long start = System.currentTimeMillis();
  83.             func.apply(list);
  84.             long stop = System.currentTimeMillis();
  85.             times[i] = stop - start;
  86.         }
  87.         long after = System.currentTimeMillis();
  88.         System.err.println("OK (n=" + list.size() + ", m=" + repeat + ", t=" + (after - before) + ")");
  89.         return times;
  90.     }
  91.  
  92.     public static void main(String[] args)
  93.     {
  94.         final int N = 10000000;
  95.         final int M = 50;
  96.  
  97.         List<long[]> times = new ArrayList<long[]>();
  98.  
  99.         System.err.print("Initializing numbers...");
  100.         List<String> strings = new ArrayList<String>(N);
  101.         for (int i = 0; i < N; ++i) {
  102.             int n = (int) (Math.random() * 1000);
  103.             strings.add("" + n);
  104.         }
  105.         System.err.println("OK");
  106.         benchmark(Stream::forLoopA, strings, M, "Warming up");
  107.  
  108.         times.add(benchmark(Stream::forLoopA, strings, M, "forLoopA"));
  109.         times.add(benchmark(Stream::forLoopL, strings, M, "forLoopL"));
  110.         times.add(benchmark(Stream::existing, strings, M, "existing"));
  111.         times.add(benchmark(Stream::collect, strings, M, "collect"));
  112.  
  113.         stats(times.get(0), "forLoopA");
  114.         stats(times.get(1), "forLoopL");
  115.         stats(times.get(2), "existing");
  116.         stats(times.get(3), "collect");
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement