1 package org.wikimedia.search.extra.superdetectnoop;
2
3 import static org.apache.lucene.util.TestUtil.randomSimpleString;
4
5 import java.util.ArrayList;
6 import java.util.Comparator;
7 import java.util.List;
8 import java.util.Locale;
9
10 import org.apache.logging.log4j.Logger;
11 import org.apache.lucene.util.CollectionUtil;
12 import org.elasticsearch.common.logging.Loggers;
13 import org.junit.Test;
14 import org.junit.runner.RunWith;
15
16 import com.carrotsearch.randomizedtesting.RandomizedRunner;
17 import com.carrotsearch.randomizedtesting.RandomizedTest;
18 import com.google.common.collect.ArrayListMultimap;
19 import com.google.common.collect.ImmutableList;
20 import com.google.common.collect.ListMultimap;
21
22
23
24
25
26 @RunWith(RandomizedRunner.class)
27 public class SetHandlerMonteCarlo extends RandomizedTest {
28 private static final Logger LOG = Loggers.getLogger(SetHandlerMonteCarlo.class, "monte carlo");
29 private static final int MAX_LIST = 10000;
30 private static final Comparator<List<Integer>> COMPARATOR = Comparator.comparingInt(l -> l.get(0));
31
32 @Test
33 public void throwDarts() {
34 time(0, 100, 5);
35
36 List<List<Integer>> times = new ArrayList<>();
37 for (int i = 0; i < 20; i++) {
38
39
40
41 int maxConvert = MAX_LIST;
42 int minConvert = randomIntBetween(0, 400);
43 int maxKeepAsList = randomIntBetween(20, 20);
44 int time = (int) printTime(minConvert, maxConvert, maxKeepAsList);
45 times.add(ImmutableList.of(time, minConvert, maxConvert, maxKeepAsList));
46 }
47 CollectionUtil.timSort(times, COMPARATOR);
48 for (Object t : times) {
49 LOG.info("{}", t);
50 }
51 }
52
53 private long printTime(int minConvert, int maxConvert, int maxKeepAsList) {
54 long time = time(minConvert, maxConvert, maxKeepAsList);
55 LOG.info(String.format(Locale.ROOT, "%5d %6d %6d %5d", time, minConvert, maxConvert, maxKeepAsList));
56 return time;
57 }
58
59 private long time(int minConvert, int maxConvert, int maxKeepAsList) {
60 SetHandler d = new SetHandler(minConvert, maxConvert, maxKeepAsList);
61 List<String> strings = new ArrayList<>();
62 for (int i = 0; i < MAX_LIST; i++) {
63 strings.add(randomSimpleString(getRandom()));
64 }
65 long total = 0;
66 for (int i = 0; i < 5000; i++) {
67 int changes = randomIntBetween(1, 200);
68 total += testCase(d, strings, randomIntBetween(1, strings.size() - 1), changes);
69 }
70 return total;
71 }
72
73 private long testCase(SetHandler d, List<String> strings, int listSize, int changesSize) {
74 List<String> list = new ArrayList<>();
75 for (int i = 0; i < listSize; i++) {
76 list.add(strings.get(i));
77 }
78 ListMultimap<String, Object> commands = ArrayListMultimap.create();
79 for (int i = 0; i < changesSize; i++) {
80 commands.put(randomBoolean() ? "add" : "remove", strings.get(randomIntBetween(0, strings.size() - 1)));
81 }
82 long start = System.currentTimeMillis();
83 d.handle(list, commands.asMap()).isCloseEnough();
84 return System.currentTimeMillis() - start;
85 }
86 }