1 package com.github.davidmoten.aws.lw.client;
2
3 import java.io.File;
4 import java.text.DecimalFormat;
5 import java.util.HashMap;
6 import java.util.List;
7
8 import org.davidmoten.kool.Statistics;
9 import org.davidmoten.kool.Stream;
10 import org.junit.Test;
11
12 public class RuntimeAnalysisTest {
13
14 @Test
15 public void test() {
16 report("src/test/resources/one-time-link-lambda-runtimes.txt");
17 report("src/test/resources/one-time-link-lambda-runtimes-sdk-v1.txt");
18 report("src/test/resources/one-time-link-lambda-runtimes-sdk-v2.txt");
19 }
20
21 private void report(String filename) {
22 List<Record> list = Stream.lines(new File(filename))
23 .map(line -> line.trim())
24 .filter(line -> !line.isEmpty())
25 .map(line -> line.replaceAll("\\s+", " "))
26 .map(line -> line.split(" "))
27 .map(x -> new Record(Double.parseDouble(x[0]), Double.parseDouble(x[1]),
28 Double.parseDouble(x[2]) * 1000))
29 .toList().get();
30
31 Stream.from(list)
32 .statistics(x -> x.coldStartRuntime2GBLight)
33 .println().go();
34
35 Stream.from(list)
36 .statistics(x -> x.actualWarmStartRuntime2GBLightAverage()).println().go();
37 ;
38
39 Stream.from(list)
40 .statistics(x -> x.apigLambdaRequestTimeMs).println().go();
41
42 Stream.from(list)
43 .statistics(x -> x.apigLambdaRequestTimeMs - x.coldStartRuntime2GBLight).println()
44 .go();
45 }
46
47 static final class Record {
48 final double coldStartRuntime2GBLight;
49 final double warmStartRuntime2GBLight10SampleAverage;
50 final double apigLambdaRequestTimeMs;
51
52 public Record(double coldStartRuntime2GBLight,
53 double warmStartRuntime2GBLight9SampleAverage, double apigLambdaRequestTimeMs) {
54 this.coldStartRuntime2GBLight = coldStartRuntime2GBLight;
55 this.warmStartRuntime2GBLight10SampleAverage = warmStartRuntime2GBLight9SampleAverage;
56 this.apigLambdaRequestTimeMs = apigLambdaRequestTimeMs;
57 }
58
59 public double actualWarmStartRuntime2GBLightAverage() {
60 return (warmStartRuntime2GBLight10SampleAverage * 10 - coldStartRuntime2GBLight) / 9;
61 }
62
63 @Override
64 public String toString() {
65 StringBuilder builder = new StringBuilder();
66 builder.append("Record [coldStartRuntime2GBLight=");
67 builder.append(coldStartRuntime2GBLight);
68 builder.append(", warmStartRuntime2GBLight9SampleAverage=");
69 builder.append(warmStartRuntime2GBLight10SampleAverage);
70 builder.append("]");
71 return builder.toString();
72 }
73
74 }
75
76 private static Stream<String> lines(String filename) {
77 return Stream.lines(new File(filename))
78 .map(line -> line.trim())
79 .filter(line -> line.length() > 0)
80 .filter(line -> !line.startsWith("#"));
81 }
82
83 @Test
84 public void testStaticFields() {
85 System.out.println("// results with static fields");
86 lines("src/test/resources/one-time-link-lambda-runtimes-2.txt")
87 .map(line -> line.split("\\s+"))
88 .skip(1)
89 .map(items -> Double.parseDouble(items[0]))
90 .statistics(x -> x)
91 .println().go();
92 lines("src/test/resources/one-time-link-lambda-runtimes-sdk-v2-2.txt")
93 .filter(line -> line.startsWith("C"))
94 .map(line -> line.split(","))
95 .skip(1)
96 .map(items -> Double.parseDouble(items[2]))
97 .statistics(x -> x).println().go();
98 lines("src/test/resources/one-time-link-lambda-runtimes-sdk-v2-2.txt")
99 .filter(line -> line.startsWith("W"))
100 .map(line -> line.split(","))
101 .map(items -> Double.parseDouble(items[2]))
102 .statistics(x -> x).println().go();
103
104 System.out.println("request time analysis with static fields");
105 System.out.println("| | Average | Stdev | Min | Max | n |");
106 System.out.println("|-------|-------|-------|------|-------|------|");
107 reportRequestTimeStats("AWS SDK v1", 0);
108 reportRequestTimeStats("AWS SDK v2", 1);
109 reportRequestTimeStats("lightweight", 2);
110 }
111
112 @Test
113 public void testStaticFields2() {
114
115
116
117
118
119 Stream<HashMap<Integer, List<String>>> o = lines(
120 "src/test/resources/one-time-link-hourly-store-request-times-raw.txt")
121 .skip(1)
122 .bufferUntil((list, x) -> x.contains("AEST"), true)
123 .map(list -> list.subList(1, list.size()))
124 .map(list -> Stream
125 .from(list)
126 .filter(x -> !x.contains("AEST"))
127 .map(y -> y.substring(10, y.length() - 1))
128 .toList().get())
129 .filter(list -> !list.stream().anyMatch(x -> Double.parseDouble(x) > 10))
130 .map(x -> Stream.from(x)
131 .mapWithIndex()
132 .groupByList(
133 HashMap::new,
134 y -> (int) (y.index() % 3),
135 y -> y.value())
136 .get());
137
138 System.out.println("cold start");
139 for (int i = 0; i < 3; i++) {
140 int j = i;
141 o.map(x -> x.get(j)).map(x -> x.get(0)).statistics(Double::parseDouble).println().go();
142 }
143
144 System.out.println("warm start");
145 Statistics light = o.map(x -> x.get(0)).flatMap(x -> Stream.from(x.subList(1, x.size())))
146 .statistics(Double::parseDouble).get();
147 for (int i = 0; i < 3; i++) {
148 int j = i;
149 Statistics stats = o.map(x -> x.get(j))
150 .flatMap(x -> Stream.from(x.subList(1, x.size())))
151 .statistics(Double::parseDouble).println().get();
152 System.out.println("z score=" + Math.abs(light.mean() - stats.mean())
153 / stats.standardDeviation() * Math.sqrt(light.count()));
154 }
155 for (int i = 0; i < 3; i++) {
156 int j = i;
157 o.map(x -> x.get(j)).flatMap(x -> Stream
158 .from(x.subList(1, x.size())))
159 .statistics(Double::parseDouble)
160 .map(x -> markdownRow(j + "", x))
161 .println().go();
162 }
163 }
164
165 private static void reportRequestTimeStats(String name, int index) {
166 lines("src/test/resources/one-time-link-hourly-store-request-times.txt")
167 .map(line -> line.split("\\s+"))
168 .map(items -> Double.parseDouble(items[index]))
169 .statistics(x -> x)
170 .map(x -> markdownRow(name, x))
171 .println()
172 .go();
173 }
174
175 public static String markdownRow(String name, Statistics x) {
176 DecimalFormat df = new DecimalFormat("0.000");
177 return "| **" + name + "** | " + df.format(x.mean()) + " | "
178 + df.format(x.standardDeviation()) + " | " + df.format(x.min()) + " | "
179 + df.format(x.max()) + " | " + x.count() + " |";
180 }
181
182 }