[Git][NTPsec/ntpsec][master] 3 commits: remove unused, expensive and un-needed percentil function.
Gary E. Miller
gitlab at mg.gitlab.com
Fri Sep 9 03:23:25 UTC 2016
Gary E. Miller pushed to branch master at NTPsec / ntpsec
Commits:
1826df4c by Gary E. Miller at 2016-09-08T19:16:16-07:00
remove unused, expensive and un-needed percentil function.
- - - - -
cdba7769 by Gary E. Miller at 2016-09-08T20:07:08-07:00
Make percentiles() return a dictionary instead of a tuple.
This simplifies the notation, but stuip %-substition does not work
with dictionaries.
namedtuples have a baffling restriction of 4 elements, so unuseable.
- - - - -
13939f76 by Gary E. Miller at 2016-09-08T20:22:06-07:00
Do multiplier in a loop, not inline.
Next up is likely putting all the autoscale/percentages in a
single function
- - - - -
2 changed files:
- ntpstats/ntpviz
- pylib/statfiles.py
Changes:
=====================================
ntpstats/ntpviz
=====================================
--- a/ntpstats/ntpviz
+++ b/ntpstats/ntpviz
@@ -120,10 +120,9 @@ set rmargin 12
values = [float(line.split()[1]) for line in self.loopstats]
values.sort()
- ninetynine, one = \
- self.percentiles( (99, 1), values)
+ percs = self.percentiles( (99, 1), values)
- if 1e-6 > ninetynine and -1e-6 < one:
+ if 1e-6 > percs[99] and -1e-6 < percs[1]:
# go to nanosec
unit = "ns"
multiplier = 1e9
@@ -133,10 +132,9 @@ set rmargin 12
values_f = [float(line.split()[2]) for line in self.loopstats]
values_f.sort()
- ninetynine_f, one_f = \
- self.percentiles( (99, 1), values_f)
+ percs_f = self.percentiles( (99, 1), values_f)
- if 1 > ninetynine_f and -1 < one_f:
+ if 1 > percs_f[99] and -1 < percs_f[1]:
# go to nanosec
unit_f = "ppb"
multiplier_f = 1e3
@@ -204,22 +202,22 @@ plot \\
unit = "ppm"
rnd = 3
- ninetynine, ninetyfive, five, one = \
- self.percentiles( (99, 95, 5, 1), values)
+ percs = self.percentiles( (99, 95, 5, 1), values)
- if 1 > ninetynine and -1 < one:
+ if 1 > percs[99] and -1 < percs[1]:
# go to ppb
multiplier = 1e3
unit = "ppb"
rnd = 0
- ninetynine = round( ninetynine * multiplier, rnd)
- ninetyfive = round( ninetyfive * multiplier, rnd)
- five = round( five * multiplier, rnd)
- one = round( one * multiplier, rnd)
+ percs.update({k: round( v * multiplier, rnd) for k, v in percs.items()})
+ ninetynine = percs[99]
+ ninetyfive = percs[95]
+ five = percs[5]
+ one = percs[1]
- nf_m_f = ninetyfive - five
- nn_m_o = ninetynine - one
+ nf_m_f = percs[95] - percs[5]
+ nn_m_o = percs[99] - percs[1]
plot_template = NTPViz.Common + """\
set title "%(sitename)s: Local Clock Frequency Offset"
set ytics format "%%1.1f %(unit)s" nomirror
@@ -258,37 +256,36 @@ plot \
values = [float(line.split()[fld - 1]) for line in self.loopstats]
values.sort()
- ninetynine, ninetyfive, five, one = \
- self.percentiles( (99, 95, 5, 1), values)
+ percs = self.percentiles( (99, 95, 5, 1), values)
- if 1e-3 <= ninetynine or -1e-3 >= one:
+ if 1e-3 <= percs[99] or -1e-3 >= percs[1]:
# go to millisec
multiplier = 1e3
if freq:
unit = "ppt"
else:
unit = "ms"
- else:
- if 1e-6 > ninetynine and -1e-6 < one:
- # go to nanosec, or ppb
- multiplier = 1e9
- rnd = 0
- if freq:
- unit = "ppb"
- else:
- unit = "ns"
+ elif 1e-6 > percs[99] and -1e-6 < percs[1]:
+ # go to nanosec, or ppb
+ multiplier = 1e9
+ rnd = 0
+ if freq:
+ unit = "ppb"
+ else:
+ unit = "ns"
- ninetynine = round( ninetynine * multiplier, rnd)
- ninetyfive = round( ninetyfive * multiplier, rnd)
- five = round( five * multiplier, rnd)
- one = round( one * multiplier, rnd)
+ percs.update({k: round( v * multiplier, rnd) for k, v in percs.items()})
+ ninetynine = percs[99]
+ ninetyfive = percs[95]
+ five = percs[5]
+ one = percs[1]
nf_m_f = ninetyfive - five
nn_m_o = ninetynine - one
plot_template = NTPViz.Common + """\
set title "%(sitename)s: %(title)s"
-set ytics format "%%1.0f %(unit)s" nomirror
+set ytics format "%%1.1f %(unit)s" nomirror
set key top right box
set style line 1 lc rgb '#0060ad' lt 1 lw 1 pt 7 ps 0 # --- blue
set style line 2 lc rgb '#dd181f' lt 1 lw 1 pt 5 ps 0 # --- red
@@ -345,7 +342,7 @@ plot \
plot_data = plot_data[:-2]
unit = "μs"
- multiplier = 1000000
+ multiplier = 1e6
rtt = 0
percentages = ""
if len(peerlist) == 1:
@@ -355,32 +352,27 @@ plot \
values = [float(line.split()[fld - 1]) for line in peerdict[ip]]
values.sort()
- ninetynine, ninetyfive, five, one = \
- self.percentiles( (99,95, 5, 1), values)
- ninetynine = round( ninetynine * multiplier, 3)
- ninetyfive = round( ninetyfive * multiplier, 3)
- five = round( five * multiplier, 3)
- one = round( one * multiplier, 3)
+ percs = self.percentiles( (99, 95, 50, 5, 1), values)
- if 1000 <= ninetynine or -1000 >= one:
+ if 1e-3 <= percs[99] or -1e-3 >= percs[1]:
# go to millisec
unit = "ms"
- multiplier = 1000
- else:
- if 1 > ninetynine and -1 < one:
- # go to nanosec
- unit = "ns"
- multiplier = 1e9
+ multiplier = 1e3
+ elif 1e-6 > percs[99] and -1e-6 < percs[1]:
+ # go to nanosec
+ unit = "ns"
+ multiplier = 1e9
+
+ rnd = 3
+ percs.update({k: round(v*multiplier, rnd) for k, v in percs.items()})
+ ninetynine = percs[99]
+ ninetyfive = percs[95]
+ fifty = percs[50]
+ five = percs[5]
+ one = percs[1]
if "offset" == type:
# fld == 4
- ninetynine, ninetyfive, fifty, five, one = \
- self.percentiles( (99,95, 50, 5, 1), values)
- ninetynine = round( ninetynine * multiplier, 3)
- ninetyfive = round( ninetyfive * multiplier, 3)
- fifty = round( fifty * multiplier, 3)
- five = round( five * multiplier, 3)
- one = round( one * multiplier, 3)
nf_m_f = ninetyfive - five
nn_m_o = ninetynine - one
@@ -448,15 +440,14 @@ plot \
values = [float(line.split()[1]) for line in self.loopstats]
values.sort()
- ninetynine, ninetyfive, five, one = \
- self.percentiles( (99,95, 5, 1), values)
+ percs = self.percentiles( (99, 95, 5, 1), values)
unit = "μs"
multiplier = 1e6
rnd = 2
rnd1 = 7 # round to 100 ns boxes
boxwidth = 1e-7
- if 1e-6 > ninetynine and -1e-6 < one:
+ if 1e-6 > percs[99] and -1e-6 < percs[1]:
# go to nanosec
unit = "ns"
multiplier = 1e9
@@ -464,10 +455,11 @@ plot \
rnd1 = 9 # round to 1 ns boxes
boxwidth = 1e-9
- ninetynine = round( ninetynine * multiplier, rnd)
- ninetyfive = round( ninetyfive * multiplier, rnd)
- five = round( five * multiplier, rnd)
- one = round( one * multiplier, rnd)
+ percs.update({k: round(v*multiplier, rnd) for k, v in percs.items()})
+ ninetynine = percs[99]
+ ninetyfive = percs[95]
+ five = percs[5]
+ one = percs[1]
cnt = collections.Counter()
for value in values:
=====================================
pylib/statfiles.py
=====================================
--- a/pylib/statfiles.py
+++ b/pylib/statfiles.py
@@ -7,7 +7,7 @@ SPDX-License-Identifier: BSD-2-Clause
"""
from __future__ import print_function, division
-import os, sys, time, glob, calendar, subprocess, socket, gzip, datetime
+import calendar, datetime, glob, gzip, os, socket, subprocess, sys, time
class NTPStats:
"Gather statistics for a specified NTP site"
@@ -123,22 +123,14 @@ class NTPStats:
if ts < m:
m = ts
return m
- def percentile(self, n, percentile, entries):
- "Return given percentiles of a given row in a given set of entries."
- "If you call this twice on the same data set you should use"
- "percentiles() instead"
- # Row is decremented so we match GNUPLOT's 1-origin indexing.
- values = [float(line.split()[n-1]) for line in entries]
- values.sort()
- return values[int(len(values) * (percentile/100))]
def percentiles(self, percents, values):
"Return given percentiles of a given row in a given set of entries."
"assuming values are already split and sorted"
- ret = []
+ ret = {}
length = len(values)
for perc in percents:
- ret.append( values[int(length * (perc/100))] )
- return tuple( ret )
+ ret[perc] = values[int(length * (perc/100))]
+ return ret
def peersplit(self):
"Return a dictionary mapping peerstats IPs to entry subsets."
peermap = {}
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/compare/59dc7e803b2c2c1aaf68d395fbb7649a9ea79f9c...13939f7672e460913e20d4e0427c3cd98a400c83
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ntpsec.org/pipermail/vc/attachments/20160909/e2cc9e6e/attachment.html>
More information about the vc
mailing list