View Javadoc
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 //        lines(
115 //                "src/test/resources/one-time-link-hourly-store-request-times-raw.txt").skip(1) //
116 //                        .bufferUntil((list, x) -> x.contains("AEST"), true) //
117 //                        .map(x -> x.subList(1, x.size())) //
118 //                        .println().go();
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 }