Skip to content

Commit b725694

Browse files
tzaeschkeTilmann Zäschke
andauthored
Median & average (#15)
Co-authored-by: Tilmann Zäschke <[email protected]>
1 parent f8a7379 commit b725694

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1111

1212
- Added async traceroute, stop SHIM, and use 30041
1313
[#14](https://github.com/netsec-ethz/scion-java-multiping/pull/14)
14+
- Added output of median and average values
15+
[#15](https://github.com/netsec-ethz/scion-java-multiping/pull/15)
1416

1517
### Fixed
1618

src/main/java/org/scion/multiping/PingAll.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import java.util.concurrent.ConcurrentHashMap;
2525
import java.util.concurrent.CountDownLatch;
2626
import java.util.concurrent.TimeUnit;
27+
import java.util.stream.Collectors;
28+
2729
import org.scion.jpan.*;
2830
import org.scion.jpan.internal.PathRawParser;
2931
import org.scion.multiping.util.*;
@@ -121,10 +123,32 @@ public static void main(String[] args) throws IOException {
121123
Result maxHops = results.stream().max(Comparator.comparingInt(Result::getHopCount)).get();
122124
Result maxPaths = results.stream().max(Comparator.comparingInt(Result::getPathCount)).get();
123125

126+
// avg/median:
127+
double avgPing =
128+
results.stream().filter(Result::isSuccess).mapToDouble(Result::getPingMs).average().orElse(-1);
129+
double avgHops =
130+
results.stream().filter(r -> r.getHopCount() > 0).mapToInt(Result::getHopCount).average().orElse(-1);
131+
double avgPaths =
132+
results.stream().filter(r -> r.getPathCount() > 0).mapToInt(Result::getPathCount).average().orElse(-1);
133+
List<Double> pings = results.stream().filter(Result::isSuccess).map(Result::getPingMs).sorted().collect(Collectors.toList());
134+
double medianPing = pings.isEmpty() ? -1 : pings.get(pings.size() / 2);
135+
List<Integer> hops = results.stream().map(Result::getHopCount).filter(hopCount -> hopCount > 0).sorted().collect(Collectors.toList());
136+
int medianHops = hops.isEmpty() ? -1 : hops.get(hops.size() / 2);
137+
List<Integer> paths = results.stream().map(Result::getPathCount).filter(pathCount -> pathCount > 0).sorted().collect(Collectors.toList());
138+
int medianPaths = paths.isEmpty() ? -1 : paths.get(paths.size() / 2);
139+
124140
println("");
125-
println("Max hops = " + maxHops.getHopCount() + ": " + maxHops);
126-
println("Max ping = " + round(maxPing.getPingMs(), 2) + "ms: " + maxPing);
127-
println("Max paths = " + maxPaths.getPathCount() + ": " + maxPaths);
141+
println("Max hops = " + maxHops.getHopCount() + ": " + maxHops);
142+
println("Max ping [ms] = " + round(maxPing.getPingMs(), 2) + ": " + maxPing);
143+
println("Max paths = " + maxPaths.getPathCount() + ": " + maxPaths);
144+
145+
println("Median hops = " + medianHops);
146+
println("Median ping [ms] = " + round(medianPing, 2));
147+
println("Median paths = " + medianPaths);
148+
149+
println("Avg hops = " + round(avgHops, 1));
150+
println("Avg ping [ms] = " + round(avgPing, 2));
151+
println("Avg paths = " + (int) round(avgPaths, 0));
128152

129153
println("");
130154
println("AS Stats:");

src/main/java/org/scion/multiping/util/Result.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ public double getPingMs() {
9191
return pingMs;
9292
}
9393

94+
public boolean isSuccess() {
95+
return state == State.SUCCESS;
96+
}
97+
9498
@Override
9599
public String toString() {
96100
String out = ScionUtil.toStringIA(isdAs) + " " + name;

0 commit comments

Comments
 (0)