summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2005-02-21 23:41:16 +0000
committerEric S. Raymond <esr@thyrsus.com>2005-02-21 23:41:16 +0000
commitfc6959cf6ad57724ee6e7a8aaf5388205db707ba (patch)
tree09e8f548e32bdf62c635109d8bd31f4ed0f151f2
parent7c53f4cb5d01cb3e0e749327e4f321ef1231b005 (diff)
downloadgpsd-fc6959cf6ad57724ee6e7a8aaf5388205db707ba.tar.gz
Add the performance white paper.
-rw-r--r--www/performance/graph1.pngbin0 -> 3994 bytes
-rw-r--r--www/performance/graph2.pngbin0 -> 4952 bytes
-rw-r--r--www/performance/graph3.pngbin0 -> 4931 bytes
-rw-r--r--www/performance/graph4.pngbin0 -> 5057 bytes
-rw-r--r--www/performance/graph5.pngbin0 -> 5616 bytes
-rw-r--r--www/performance/performance.xml475
-rw-r--r--www/performance/profile1.txt101
-rw-r--r--www/performance/profile2.txt103
-rw-r--r--www/performance/profile3.txt103
-rw-r--r--www/performance/profile4.txt103
-rw-r--r--www/performance/profile5.txt103
11 files changed, 988 insertions, 0 deletions
diff --git a/www/performance/graph1.png b/www/performance/graph1.png
new file mode 100644
index 00000000..c713cb68
--- /dev/null
+++ b/www/performance/graph1.png
Binary files differ
diff --git a/www/performance/graph2.png b/www/performance/graph2.png
new file mode 100644
index 00000000..179b432a
--- /dev/null
+++ b/www/performance/graph2.png
Binary files differ
diff --git a/www/performance/graph3.png b/www/performance/graph3.png
new file mode 100644
index 00000000..0f105892
--- /dev/null
+++ b/www/performance/graph3.png
Binary files differ
diff --git a/www/performance/graph4.png b/www/performance/graph4.png
new file mode 100644
index 00000000..4057cf52
--- /dev/null
+++ b/www/performance/graph4.png
Binary files differ
diff --git a/www/performance/graph5.png b/www/performance/graph5.png
new file mode 100644
index 00000000..2f273884
--- /dev/null
+++ b/www/performance/graph5.png
Binary files differ
diff --git a/www/performance/performance.xml b/www/performance/performance.xml
new file mode 100644
index 00000000..75e4d153
--- /dev/null
+++ b/www/performance/performance.xml
@@ -0,0 +1,475 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE article PUBLIC
+ "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "docbook/docbookx.dtd" [
+<!ENTITY howto "http://en.tldp.org/HOWTO/">
+<!ENTITY mini-howto "http://en.tldp.org/HOWTO/mini/">
+<!ENTITY homepage "http://catb.org/~esr/">
+]>
+<article>
+<title>Where's the Latency? Performance analysis of GPSes and GPSD</title>
+
+<articleinfo>
+
+<author>
+ <firstname>Eric</firstname>
+ <othername>Steven</othername>
+ <surname>Raymond</surname>
+ <affiliation>
+ <orgname><ulink url="&homepage;">
+ Thyrsus Enterprises</ulink></orgname>
+ <address>
+ <email>esr@thyrsus.com</email>
+ </address>
+ </affiliation>
+</author>
+<copyright>
+ <year>2005</year>
+ <holder role="mailto:esr@thyrsus.com">Eric S. Raymond</holder>
+</copyright>
+<!-- legalnotice>
+ <title>Copyright</title>
+ <para>Permission is granted to copy, distribute and/or modify
+ this document under the terms of the Open Publication License,
+ version 2.0.</para>
+</legalnotice -->
+
+<revhistory>
+ <revision>
+ <revnumber>1.0</revnumber>
+ <date>21 February 2005</date>
+ <authorinitials>esr</authorinitials>
+ <revremark>
+ Initial draft.
+ </revremark>
+ </revision>
+</revhistory>
+
+<abstract>
+<para>Many GPS manufacturers tout binary protocols more dense than
+NMEA and baud rates higher than the NMEA-standard 4800 bps as ways to
+increase GPS performance. While working on
+<application>gpsd</application>, I became interested in evaluating
+these claims, which have some implications for the design of
+<application>gpsd</application>. This paper discusses the theory and
+the results of profiling the code, and reaches some conclusions about
+system tuning and latency control.</para>
+</abstract>
+</articleinfo>
+
+<sect1><title>What Can We Measure and Improve?</title>
+
+<para>The most important characteristic of a GPS, the positional
+accuracy of its fixes, is a function of the GPS system and receiver
+design; GPSD can do nothing to affect it. However, a GPS fix has a
+timestamp, and the transmission path from the GPS to a user
+application introduces some latency (that is, delay between the time
+of fix and when it is available to the user). Latency could be significant
+source of error for a GPS in motion.</para>
+
+<para>The case we'll consider is a normal consumer-grade USB sensor
+attached to a Linux machine via an RS232 or USB link, reporting to
+<application>gpsd</application> which is polled via sockets by
+application. Consider the whole transmission path of a PVT
+(position/velocity/time) report from a GPS to the user or user
+application. It has the following stages:</para>
+
+<orderedlist>
+<listitem>
+<para>A PVT report is generated in the GPS</para>
+</listitem>
+<listitem>
+<para>It is encoded (into NMEA or a vendor binary protocol)
+and buffered for transmission via serial link.</para>
+</listitem>
+<listitem>
+<para>The encoding is transmitted via serial link to a buffer in GPSD.</para>
+</listitem>
+<listitem>
+<para>The encoding is decoded and translated into a notification in
+GPSD's protocol.</para>
+</listitem>
+<listitem>
+<para>The GPSD-protocol notification is polled and read over a
+client socket.</para>
+</listitem>
+<listitem>
+<para>The GPSD-protocol notification is decoded by libgps and unpacked
+into a session structure available to the user application.</para>
+</listitem>
+</orderedlist>
+
+<para>It is also relevant that consumer-grade GPses do not expect to
+be polled, but are designed to issue PVT reports on a fixed cycle
+time, which we'll call C and which is usually 1
+second. <application>gpsd</application> expects this. A few GPSes
+(notably SiRF-II-based ones) can be polled, and we might thus be able
+to pull PVT reports out of them at a higher rate.
+<application>gpsd</application> doesn't do this; one question this
+investigation can address is whether there would be any point to
+that.</para>
+
+<para>At various times GPS manufacturers have promoted proprietary
+binary protocols and transmission speeds higher than the NMEA-standard
+4800bps as ways to improve GPS performance. Obviously these cannot
+affect positional accuracy; all they can change is the latency at
+stages 2, 3, and 4.</para>
+
+<para>The implementation of <application>gpsd</application> affects
+how much latency is introduced at stage 4. The design of the
+<application>gpsd</application> protocol (in particular, the average
+and worst-case size and complexity of a position/velocity/time report)
+affects how much latency is introduced at stages 5, 6, and 7.</para>
+
+<para>At stages 5 and later, the client design and implementation
+matter a lot. In particular, it matters how frequently the client
+samples the PVT reports that <application>gpsd</application> makes
+available.</para>
+
+<para>The list of stages above implies the following formula for
+expected latency L, and a set of tactics for reducing it:</para>
+
+<literallayout>
+L = C/2 + E1 + T1 + D1 + W + E2 + T2 + D2
+</literallayout>
+
+<para>where:</para>
+
+<orderedlist>
+<listitem>
+<para>C/2 is the expected delay introduced by a cycle time of C
+(worst-case delay would just be C). We can decrease this by decreasing
+C, but consumer-grade GPSes don't go below 1 second.</para>
+</listitem>
+<listitem>
+<para>E1 is PVT encoding time within the GPS. We can't affect this.</para>
+</listitem>
+<listitem>
+<para>T1 is transmission time over the serial link. We can decrease
+this by raising the baud rate or increasing the information density
+of the encoding.</para>
+</listitem>
+<listitem>
+<para>D1 is decode time required for <application>gpsd</application>
+to update its session structure. We can decrease this, if need be,
+by tuning the implementation or using faster hardware.</para>
+</listitem>
+<listitem>
+<para>W is the wait until the application polls
+<application>gpsd</application>. This can only be reduced by designing
+the application to poll frequently.</para>
+</listitem>
+<listitem>
+<para>E2 is PVT encoding time within the daemon. We can speed this up
+with faster hardware or a simpler GPSD format.</para>
+</listitem>
+<listitem>
+<para>T2 is transmission time over the client socket. Faster hardware,
+a better TCP/IP stack or a denser encoding can decrease this.</para>
+</listitem>
+<listitem>
+<para>D3 is decoding time required for the client library to update
+the session structure visible to the user application. A simpler
+GPSD format could decrease this</para>
+</listitem>
+</orderedlist>
+
+<para>The total figure L is of interest, of course. The first
+question to ask is how it compares to C. But to know where
+tuning this system is worth the effort and where it isn't, the
+relative magnitude of these six components is what is important. In
+particular, if C or E1 dominate, there is no point in trying to tune
+the system at all.</para>
+
+<para>The rule on modern hardware is that computation is cheap,
+communication is expensive. By this rule, we expect E1, D1, E2, and D2 to
+be small relative to T1 and T2. We can't predict W. Thus there is no
+knowing how the sum of the other terms will compare to C, but we know
+that E1 + T1 is the other statistic GPS vendors can easily measure. C
+&lt; E1 + T1 would be a bad idea, and we can guess that competition among
+GPS vendors will probably tend to push C downwards to the point where
+it's not much larger than E1 + T1.</para>
+
+<para>C is known from manufacturer specifications.
+<application>gpsd</application> and its client libraries can be built
+with profiling code that measures all the other timing variables. The
+tool
+<citerefentry><refentrytitle>gpsprof</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+collects this data and generates reports and plots from it. There
+are, however, some sources of error to be aware of:</para>
+
+<itemizedlist>
+<listitem>
+<para>Our way of measuring E1 and T1 is to collect a timestamp on the
+first character read of a new NMEA sentence, then on the terminating
+newline, and compare those to the GPS timestamp on the sentence.
+While this will measure E1+T1 accurately, it will underestimate
+the contribution of T1 to the whole because it doesn't measure
+RS232 activity taking place before the first character becomes
+visible at the receive end.</para>
+</listitem>
+<listitem>
+<para>The $ clause that the daemon uses to ship per-sentence profiling info to
+the client adds substantial bulk to the traffic. Thus, it will tend
+to inflate E2, T2, and D2 somewhat.</para>
+</listitem>
+<listitem>
+<para>The client library used for profiling is written in Python,
+which will further inflate D2 relative to the C client library most
+applications are likely to use.</para>
+</listitem>
+<listitem>
+<para>The system-call overhead of profiling (seven
+<citerefentry><refentrytitle>gettimeofday</refentrytitle><manvolnum>2</manvolnum></citerefentry>
+calls per sentence to collect timestamps, several other time-library
+calls per sentence to convert ISO8661 timestamps) will introduce a
+small amount of noise into the figures. These are cheap calls that
+don't induce disk activity; thus, on modern hardware; we may expect
+the overhead per call to be at worst in the microsecond range. The
+entire per-sentence overhead system-call overhead should be on the
+order of ten microseconds.</para>
+</listitem>
+</itemizedlist>
+
+</sect1>
+<sect1><title>Data and Analysis</title>
+
+<para>I took measurements using a Haicom 204s USB GPS mouse. This
+device, using a SiRF-II GPS chipset and PL2303 USB-to-serial chipset, is
+very typical of today's consumer-grade GPS hardware; the Haicom people
+themselves estimated to me in late 2004 that the SirF-II had about 80%
+and rising market share, and the specification sheets I find with
+Web searches back this up. Each profile run used 100 samples.</para>
+
+<para>My host system for the measurements was an Opteron 3400 running an
+"everything" installation of Fedora Core 3. This is still a
+moderately fast machine in early 2005, but average processor
+utilization remained low throughout the tests.</para>
+
+<para>The version of the GPSD software I used for the test was
+released as 2.13. It was configured with --enable-profiling. All
+graphs and figures were generated with
+<citerefentry><refentrytitle>gpsprof</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+a tool built for this purpose and included in the distribution.</para>
+
+<para>One of the effects of building with --enable-profiling is that a
+form of the B command that normally just reports the RS232 parameters
+can be used to set them (it ships a SiRF-II control string to
+the GPS and then changes the line settings). I discovered that
+something in the SiRF-II/PL2303 combination chokes on line speeds
+of 19200 and up.</para>
+
+<para>Another effect is to enable a Z command to switch on profiling.
+When profiling is on, each time
+<application>gpsd</application>
+reports a fix with timestamp (e.g. on GPGGA, GPMRC and GPGLL
+sentences) it also reports timing information from five checkpoints
+inside the daemon. The client library adds two more checkpoints.</para>
+
+<para>Our first graph is with profile reporting turned off, to give us
+a handle on performance with the system disturbed as little as
+possible. This was generated with <command>gpsprof -t "Haicom 204s" -T png -f
+uninstrumented -s 4800</command>. We'll compare it to later plots to
+see the effect of profiling overhead.</para>
+
+<figure><title>Total latency</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref='graph1.png'/>
+ </imageobject>
+</mediaobject>
+</figure>
+
+<para>The first thing to notice here is that the fix latency can be
+just over a second; you can see the exact figures in the <ulink
+url='profile1.txt'>raw data</ulink>. Where is the time going? Our next
+graph was generated with This was generated with <command>gpsprof -t
+"Haicom 204s" -T png -f raw -s 4800</command></para>
+
+<figure><title>Instrumented latency report</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref='graph2.png'/>
+ </imageobject>
+</mediaobject>
+</figure>
+
+<para>By comparing this graph to the previous one, it is pretty clear
+that the profiling reports are not introducing any measurable latency.
+But what is more interesting is to notice that D1 + W + E2 + T2 + D2
+vanishes &mdash; at this timescale, all we can see is E1 and T1.</para>
+
+<para>The <ulink url='profile2.txt'>raw data</ulink> bears this out. All
+times besides E1 and T1 are so small that they are comparable to the
+noise level of the measurements. This may be a bit surprising unless
+one remembers that W=0 is expected in this setup, and that a modern
+zero-copy TCP/IP stack like Linux's implements local sockets with very
+low overhead. It is also a little surprising that E1 is so large
+relative to E1+T1. Recall, however, that this may be measurement
+error.</para>
+
+<para>Our third graph (<command>gpsprof -t "Haicom 204s" -T
+png -f split -s 4800</command> changes the presentation so we can see
+how latency varies with sentence type.</para>
+
+<figure><title>Split latency report</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref='graph3.png'/>
+ </imageobject>
+</mediaobject>
+</figure>
+
+<para>The reason for the comb pattern in the previous graphs is now
+apparent; latency is constant for any given sentence type. The obvious
+correlate would be sentence length &mdash; but looking at the <ulink
+url='profile3.txt'>raw data</ulink>, we see that that is not the only
+factor. Consider this table:</para>
+
+<informaltable>
+<tgroup cols='3'>
+<thead>
+<row>
+<entry>Sentence type</entry>
+<entry>Typical length</entry>
+<entry>Typical latency</entry>
+</row>
+</thead>
+<tbody>
+<row>
+<entry>GPRMC</entry>
+<entry>70</entry>
+<entry>1.01</entry>
+</row>
+<row>
+<entry>GPGGA</entry>
+<entry>81</entry>
+<entry>0.23</entry>
+</row>
+<row>
+<entry>GPGLL</entry>
+<entry>49</entry>
+<entry>0.31</entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>For illustration, here are some sample NMEA sentences logged
+while I was conducting these tests:</para>
+
+<literallayout>
+$GPRMC,183424.834,A,4002.1033,N,07531.2003,W,0.00,0.00,170205,,*11
+$GPGGA,183425.834,4002.1035,N,07531.2004,W,1,05,1.9,134.7,M,-33.8,M,0.0,0000*48
+$GPGLL,4002.1035,N,07531.2004,W,183425.834,A*27
+</literallayout>
+
+<para>Though GPRMCs are shorter than GPGAs, they consistently have an
+associated latency four times as long. The graph tells us most of
+this is E1. There must be something the GPS is doing that is
+computationally very expensive when it generates GPRMCs. It may well
+be that it is actually doing that fix at that point in the send cycle
+and buffering the results for retransmission in GPGGA and GPGLL forms.
+Alternatively, perhaps the speed/track computation is
+expensive.</para>
+
+<para>Now let's look at how the picture changes when we double the
+baud rate. <command>gpsprof -t "Haicom 204s" -T png -s 9600</command>
+gives us this:</para>
+
+<figure><title>Split latency report, 9600bps</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref='graph4.png'/>
+ </imageobject>
+</mediaobject>
+</figure>
+
+<para>This graph looks almost identical to the previous one, except
+for vertical scale &mdash; latency has been cut neatly in half.
+Transmission times for GPMRC go from about 0.15sec to 0.75sec. Oddly,
+average E1 is also cut almost in half. I don't know how to explain
+this, unless a, lot of what looks like E1 is actually RS232
+transmission time spent before the first character appears in the
+daemon's receive buffers. You can also view the
+<ulink url='profile4.txt'>raw data</ulink></para>
+
+<para>For comparison, here's the same plot made with a BU303b, a
+different USB GPS mouse using the same SiRF-II/PL2303 combination:</para>
+
+<figure><title>Split latency report, 9600bps</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref='graph5.png'/>
+ </imageobject>
+</mediaobject>
+</figure>
+
+<para>This, and the <ulink url='profile5.txt'>raw data</ulink>, look
+very similar to the Haicom numbers. The main difference seems to be
+that the BU303b firmware doesn't ship GPGLL by default.</para>
+
+</sect1>
+<sect1><title>Conclusions</title>
+
+<para>All these conclusions apply to the consumer-grade GPS hardware
+generally available in 2005, e.g. with a C of one second.</para>
+
+<sect2><title>For Application Programmers</title>
+
+<para>For the best tradeoff between minimizing latency and use of
+application resources, Nyquist's Theorem tells us to poll
+<application>gpsd</application> once every half-cycle &mdash; that is,
+on almost all GPSes at time of writing, twice a second.</para>
+
+<para>With the SiRF-II chips used in most consumer-grade GPSes at time of
+writing, 9600bps is the optimal line speed. 4800 is slightly too low,
+not guaranteeing updates within the 1-second cycle time. 9600bps
+yields updates in about 0.5sec.</para>
+
+</sect2>
+<sect2><title>For Manufacturer Claims</title>
+
+<para>At the 1-second cycle time of consumer-grade devices, being able
+to operate at 9600bps is useful, but higher speeds would not be worth
+the effort.</para>
+
+<para>Comparing the SiRF-II performance at 4800bps and 9600 shows a
+drop in E1+T1 that looks about linear, suggesting that for a cycle of
+n seconds, the optimal line speed would be about 9600/n. Since future
+GPS chips are likely to have faster processors and thus less latency,
+this may be considered an upper bound on useful line speed.</para>
+
+<para>Because 9600bps is readily available, the transmission- and
+decode-time advantages of binary protocols over NMEA are not
+significant within a 1-per-second update cycle. Because line speeds
+up to 38400 are readily available through standard UARTs, we may
+expect this to continue to be the case even with cycle times as
+low as 0.25sec.</para>
+
+<para>More generally, binary protocols are largely pointless except as
+market-control devices for the the manufacturers. The additional
+capabilities they support could be just as effectively supported
+through NMEA's $P-prefix extension mechanism.</para>
+
+</sect2>
+<sect2><title>For the Design of <application>gpsd</application></title>
+
+<para><application>gpsd</application> does not introduce measurable
+latency into the path from GPS to application. Cycle times would
+have to decrease by two orders of magnitude for this to change.</para>
+
+<para>Setting a 9600bps line speed, and then polling the GPS twice a
+second rather than waiting for an update, would halve the expected
+latency of the system from 0.5 to 0.25sec. This would be right at the
+edge of the SiRF-II's performance envelope.</para>
+
+</sect2>
+</sect1>
+</article>
+
+<!--
+Local Variables:
+compile-command: "xmlto xhtml-nochunks performance.xml"
+End:
+-->
diff --git a/www/performance/profile1.txt b/www/performance/profile1.txt
new file mode 100644
index 00000000..abd57eff
--- /dev/null
+++ b/www/performance/profile1.txt
@@ -0,0 +1,101 @@
+# Uninstrumented total latency, Haicom 204s, 4800N1, cycle 1s
+1.023544
+0.216441
+0.328521
+1.014338
+0.218396
+0.330239
+1.015195
+0.217151
+0.329242
+1.014043
+0.218018
+0.331103
+1.014912
+0.218858
+0.330814
+1.015768
+0.218726
+0.330656
+1.014628
+0.217569
+0.329597
+1.014489
+0.219423
+0.331382
+1.017343
+0.218288
+0.330230
+1.015204
+0.218140
+0.330093
+1.015062
+0.218026
+0.329950
+1.014920
+0.217866
+0.329804
+1.014778
+0.218399
+0.329669
+1.014649
+0.216587
+0.329547
+1.013621
+0.217451
+0.329379
+1.014595
+0.217313
+0.329242
+1.014322
+0.217170
+0.330095
+1.014103
+0.220021
+0.331948
+1.017168
+0.216968
+0.328808
+1.013795
+0.217733
+0.329671
+1.014644
+0.217747
+0.329588
+1.015501
+0.220539
+0.332400
+1.017363
+0.218310
+0.330246
+1.015243
+0.217174
+0.330103
+1.014075
+0.218030
+0.329970
+1.014937
+0.220887
+0.332820
+1.017795
+0.216746
+0.329681
+1.013685
+0.220602
+0.332550
+1.017514
+0.218465
+0.331394
+1.015367
+0.222329
+0.335256
+1.019225
+0.218169
+0.330136
+1.015086
+0.218043
+0.330045
+1.014940
+0.218888
+0.330904
+1.015802
diff --git a/www/performance/profile2.txt b/www/performance/profile2.txt
new file mode 100644
index 00000000..a64cb9b3
--- /dev/null
+++ b/www/performance/profile2.txt
@@ -0,0 +1,103 @@
+# Raw latency data, Haicom 204s, 4800N1, cycle 1s
+# T1 E1 D1 W E2 T2 D2 tag
+#- -------- -------- -------- -------- -------- -------- -------- --------
+69 0.864900 1.018900 1.019400 1.019400 1.019500 1.019593 1.019731 # GPRMC
+82 0.033900 0.216800 0.217400 0.217400 0.217400 0.217559 0.217680 # GPGGA
+49 0.222000 0.328800 0.329400 0.329400 0.329400 0.329537 0.329626 # GPGLL
+69 0.860800 1.013700 1.014300 1.014300 1.014300 1.014449 1.014584 # GPRMC
+82 0.033700 0.216700 0.217300 0.217300 0.217300 0.217420 0.217540 # GPGGA
+49 0.221700 0.328700 0.329200 0.329200 0.329300 0.329390 0.329479 # GPGLL
+69 0.860700 1.013600 1.014200 1.014200 1.014200 1.014310 1.014447 # GPRMC
+82 0.033600 0.216600 0.217100 0.217100 0.217100 0.217284 0.217406 # GPGGA
+49 0.220600 0.329500 0.330100 0.330100 0.330100 0.330258 0.330350 # GPGLL
+69 0.860500 1.014400 1.015000 1.015000 1.015000 1.015165 1.015304 # GPRMC
+82 0.035500 0.218400 0.219000 0.219000 0.219000 0.219163 0.219283 # GPGGA
+49 0.223400 0.330400 0.331000 0.331000 0.331000 0.331112 0.331201 # GPGLL
+69 0.862300 1.015300 1.015900 1.015900 1.015900 1.016027 1.016163 # GPRMC
+82 0.035300 0.218300 0.218800 0.218800 0.218900 0.219001 0.219119 # GPGGA
+49 0.223300 0.330300 0.330800 0.330900 0.330900 0.331062 0.331152 # GPGLL
+69 0.862200 1.015200 1.015700 1.015700 1.015700 1.015880 1.016016 # GPRMC
+82 0.035200 0.218100 0.218700 0.218700 0.218700 0.218854 0.218973 # GPGGA
+49 0.222300 0.330100 0.330700 0.330700 0.330700 0.330825 0.330917 # GPGLL
+69 0.861000 1.015000 1.015600 1.015600 1.015600 1.015767 1.015905 # GPRMC
+82 0.034000 0.218000 0.218600 0.218600 0.218600 0.218717 0.218838 # GPGGA
+49 0.222000 0.330000 0.330500 0.330500 0.330600 0.330693 0.330784 # GPGLL
+69 0.860900 1.014900 1.015500 1.015500 1.015500 1.015625 1.015763 # GPRMC
+82 0.033900 0.216900 0.217400 0.217400 0.217400 0.217568 0.217695 # GPGGA
+49 0.221900 0.328900 0.329400 0.329400 0.329400 0.329636 0.329722 # GPGLL
+69 0.859800 1.013700 1.014300 1.014300 1.014300 1.014450 1.014585 # GPRMC
+82 0.033800 0.216700 0.217300 0.217300 0.217300 0.217451 0.217571 # GPGGA
+49 0.221900 0.328700 0.329200 0.329200 0.329300 0.329399 0.329515 # GPGLL
+69 0.859600 1.014600 1.015200 1.015200 1.015200 1.015311 1.015449 # GPRMC
+82 0.034600 0.217600 0.218100 0.218100 0.218200 0.218294 0.218414 # GPGGA
+49 0.222600 0.329600 0.330100 0.330100 0.330100 0.330258 0.330349 # GPGLL
+69 0.861500 1.014500 1.015000 1.015000 1.015000 1.015170 1.015306 # GPRMC
+82 0.035500 0.218500 0.219000 0.219000 0.219100 0.219186 0.219307 # GPGGA
+49 0.222400 0.330400 0.331000 0.331000 0.331000 0.331115 0.331204 # GPGLL
+69 0.861300 1.015300 1.015900 1.015900 1.015900 1.016035 1.016169 # GPRMC
+82 0.034300 0.217300 0.217900 0.217900 0.217900 0.218039 0.218160 # GPGGA
+49 0.222300 0.329300 0.329800 0.329800 0.329800 0.329968 0.330059 # GPGLL
+69 0.861200 1.014200 1.014700 1.014700 1.014800 1.014891 1.015027 # GPRMC
+82 0.034200 0.217100 0.217700 0.217700 0.217800 0.217889 0.218009 # GPGGA
+49 0.222200 0.329100 0.329700 0.329700 0.329700 0.329831 0.329920 # GPGLL
+69 0.861100 1.014000 1.014600 1.014600 1.014600 1.014752 1.014890 # GPRMC
+82 0.036000 0.219000 0.219600 0.219600 0.219600 0.219715 0.219835 # GPGGA
+49 0.224000 0.331000 0.331500 0.331500 0.331600 0.331697 0.331785 # GPGLL
+69 0.862900 1.015900 1.016400 1.016500 1.016500 1.016609 1.016744 # GPRMC
+82 0.032900 0.216900 0.217400 0.217400 0.217400 0.217574 0.217692 # GPGGA
+49 0.220900 0.328800 0.329400 0.329400 0.329400 0.329555 0.329646 # GPGLL
+69 0.859800 1.012700 1.013300 1.013300 1.013300 1.013462 1.013598 # GPRMC
+82 0.033700 0.216700 0.217300 0.217300 0.217300 0.217434 0.217552 # GPGGA
+49 0.221700 0.328700 0.329200 0.329300 0.329300 0.329427 0.329518 # GPGLL
+69 0.861600 1.014600 1.015200 1.015200 1.015200 1.015318 1.015453 # GPRMC
+82 0.033600 0.216600 0.217100 0.217100 0.217200 0.217294 0.217413 # GPGGA
+49 0.221700 0.328600 0.329100 0.329100 0.329100 0.329259 0.329350 # GPGLL
+69 0.860500 1.013500 1.014100 1.014100 1.014100 1.014291 1.014427 # GPRMC
+82 0.034500 0.217500 0.218000 0.218100 0.218100 0.218212 0.218332 # GPGGA
+49 0.221400 0.329400 0.330000 0.330000 0.330000 0.330120 0.330212 # GPGLL
+69 0.860300 1.014300 1.014900 1.014900 1.014900 1.015047 1.015183 # GPRMC
+82 0.034300 0.217300 0.217900 0.217900 0.217900 0.218128 0.218247 # GPGGA
+49 0.221300 0.329400 0.329900 0.329900 0.329900 0.330135 0.330224 # GPGLL
+69 0.860200 1.014200 1.014700 1.014700 1.014800 1.014895 1.015031 # GPRMC
+82 0.034200 0.218100 0.218700 0.218700 0.218800 0.218898 0.219016 # GPGGA
+49 0.222200 0.330100 0.330700 0.330700 0.330700 0.330828 0.330915 # GPGLL
+69 0.861100 1.015000 1.015600 1.015600 1.015600 1.015759 1.015893 # GPRMC
+82 0.034000 0.217000 0.217600 0.217600 0.217600 0.217718 0.217836 # GPGGA
+49 0.221000 0.329000 0.329600 0.329600 0.329600 0.329735 0.329825 # GPGLL
+69 0.859900 1.013900 1.014500 1.014500 1.014500 1.014639 1.014773 # GPRMC
+81 0.029900 0.210900 0.211500 0.211500 0.211500 0.211617 0.211737 # GPGGA
+49 0.215900 0.322900 0.323400 0.323400 0.323400 0.323544 0.323631 # GPGLL
+69 0.842800 0.996800 0.997400 0.997400 0.997400 0.997524 0.997661 # GPRMC
+81 0.026900 0.207800 0.208300 0.208300 0.208300 0.208474 0.208593 # GPGGA
+49 0.212800 0.319700 0.320300 0.320300 0.320300 0.320407 0.320522 # GPGLL
+69 0.839600 0.993600 0.994200 0.994200 0.994200 0.994335 0.994472 # GPRMC
+81 0.026600 0.207600 0.208100 0.208100 0.208200 0.208301 0.208422 # GPGGA
+49 0.212600 0.319600 0.320100 0.320100 0.320100 0.320258 0.320347 # GPGLL
+69 0.839600 0.993500 0.994000 0.994000 0.994100 0.994198 0.994335 # GPRMC
+81 0.029500 0.210400 0.211000 0.211000 0.211000 0.211171 0.211292 # GPGGA
+49 0.214500 0.322400 0.323000 0.323000 0.323000 0.323125 0.323212 # GPGLL
+69 0.842400 0.995300 0.995900 0.995900 0.995900 0.996053 0.996189 # GPRMC
+81 0.027300 0.208400 0.208900 0.208900 0.209000 0.209180 0.209311 # GPGGA
+49 0.212300 0.320300 0.320900 0.320900 0.320900 0.321009 0.321097 # GPGLL
+69 0.840300 0.993200 0.993700 0.993700 0.993800 0.993906 0.994042 # GPRMC
+81 0.026200 0.207200 0.207700 0.207700 0.207700 0.207877 0.207999 # GPGGA
+49 0.212200 0.319100 0.319700 0.319700 0.319700 0.319834 0.319922 # GPGLL
+69 0.839100 0.993200 0.993700 0.993800 0.993800 0.993965 0.994114 # GPRMC
+81 0.026100 0.207000 0.207600 0.207600 0.207600 0.207733 0.207854 # GPGGA
+49 0.212000 0.320000 0.320600 0.320600 0.320600 0.320707 0.320795 # GPGLL
+69 0.839000 0.992900 0.993500 0.993500 0.993500 0.993625 0.993762 # GPRMC
+81 0.025900 0.206900 0.207400 0.207400 0.207500 0.207590 0.207709 # GPGGA
+49 0.210900 0.319300 0.319900 0.319900 0.319900 0.320362 0.320450 # GPGLL
+69 0.839900 0.992800 0.993300 0.993300 0.993300 0.993478 0.993614 # GPRMC
+81 0.028800 0.209800 0.210300 0.210300 0.210300 0.210483 0.210603 # GPGGA
+49 0.213700 0.321800 0.322400 0.322400 0.322400 0.322617 0.322723 # GPGLL
+69 0.841600 0.994600 0.995200 0.995200 0.995200 0.995344 0.995480 # GPRMC
+81 0.029600 0.209600 0.210100 0.210100 0.210200 0.210303 0.210424 # GPGGA
+49 0.214600 0.322600 0.323100 0.323100 0.323200 0.323294 0.323381 # GPGLL
+69 0.842500 0.995500 0.996000 0.996000 0.996100 0.996195 0.996332 # GPRMC
+81 0.026500 0.207400 0.208000 0.208000 0.208000 0.208163 0.208283 # GPGGA
+49 0.212500 0.319400 0.320000 0.320000 0.320000 0.320136 0.320225 # GPGLL
+69 0.839400 0.993300 0.993900 0.993900 0.993900 0.994054 0.994191 # GPRMC
+81 0.028300 0.209300 0.209900 0.209900 0.209900 0.210037 0.210158 # GPGGA
+49 0.213300 0.321400 0.321900 0.321900 0.322000 0.322088 0.322175 # GPGLL
+69 0.841200 0.994200 0.994800 0.994800 0.994800 0.994924 0.995058 # GPRMC
diff --git a/www/performance/profile3.txt b/www/performance/profile3.txt
new file mode 100644
index 00000000..8b13681c
--- /dev/null
+++ b/www/performance/profile3.txt
@@ -0,0 +1,103 @@
+# Split latency data, Haicom 204s, 4800N1, cycle 1s
+# GPGGA GPRMC GPGLL T1 D1 W E2 T2 D2 length tag
+# --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
+- 0.874600 - 1.019000 1.019600 1.019600 1.019600 1.019769 1.019908 70 # GPRMC
+0.034000 - - 0.215000 0.215600 0.215600 0.215600 0.215717 0.215837 81 # GPGGA
+- - 0.220000 0.327100 0.327600 0.327700 0.327700 0.327946 0.328045 49 # GPGLL
+- 0.855900 - 1.011900 1.012400 1.012500 1.012500 1.012609 1.012745 70 # GPRMC
+0.033900 - - 0.214900 0.215500 0.215500 0.215500 0.215645 0.215766 81 # GPGGA
+- - 0.219900 0.326900 0.327400 0.327400 0.327400 0.327583 0.327672 49 # GPGLL
+- 0.855800 - 1.011700 1.012300 1.012300 1.012300 1.012467 1.012602 70 # GPRMC
+0.033000 - - 0.213700 0.214300 0.214300 0.214300 0.214432 0.214553 81 # GPGGA
+- - 0.218700 0.326700 0.327300 0.327300 0.327300 0.327515 0.327604 49 # GPGLL
+- 0.855600 - 1.010600 1.011200 1.011200 1.011200 1.011331 1.011466 70 # GPRMC
+0.032700 - - 0.213600 0.214100 0.214200 0.214200 0.214310 0.214430 81 # GPGGA
+- - 0.218600 0.330200 0.330700 0.330700 0.330800 0.331253 0.331340 49 # GPGLL
+- 0.855500 - 1.011500 1.012000 1.012000 1.012000 1.012184 1.012322 70 # GPRMC
+0.033500 - - 0.214400 0.215000 0.215000 0.215000 0.215154 0.215273 81 # GPGGA
+- - 0.219500 0.327400 0.328000 0.328000 0.328000 0.328143 0.328232 49 # GPGLL
+- 0.857400 - 1.011300 1.011900 1.011900 1.011900 1.012046 1.012181 70 # GPRMC
+0.034400 - - 0.215300 0.215800 0.215800 0.215900 0.216003 0.216125 81 # GPGGA
+- - 0.219300 0.327300 0.327800 0.327800 0.327800 0.327973 0.328061 49 # GPGLL
+- 0.856200 - 1.012200 1.012700 1.012700 1.012800 1.012892 1.013027 70 # GPRMC
+0.039200 - - 0.219100 0.219700 0.219700 0.219700 0.219858 0.219979 81 # GPGGA
+- - 0.224100 0.332500 0.333100 0.333100 0.333100 0.333255 0.333346 49 # GPGLL
+- 0.861100 - 1.016000 1.016600 1.016600 1.016600 1.016745 1.016884 70 # GPRMC
+0.035000 - - 0.216000 0.216500 0.216600 0.216600 0.216712 0.216833 81 # GPGGA
+- - 0.220100 0.328000 0.328500 0.328500 0.328600 0.328688 0.328777 49 # GPGLL
+- 0.856900 - 1.012900 1.013500 1.013500 1.013500 1.013670 1.013807 70 # GPRMC
+0.033900 - - 0.214800 0.215400 0.215400 0.215400 0.215564 0.215685 81 # GPGGA
+- - 0.219900 0.327800 0.328400 0.328400 0.328400 0.328541 0.328629 49 # GPGLL
+- 0.856800 - 1.011700 1.012300 1.012300 1.012300 1.012475 1.012611 70 # GPRMC
+0.036700 - - 0.216700 0.217300 0.217300 0.217300 0.217548 0.217668 81 # GPGGA
+- - 0.221700 0.329700 0.330300 0.330300 0.330300 0.330431 0.330519 49 # GPGLL
+- 0.858600 - 1.013600 1.014100 1.014100 1.014200 1.014309 1.014446 70 # GPRMC
+0.035600 - - 0.216600 0.217100 0.217100 0.217100 0.217281 0.217402 81 # GPGGA
+- - 0.221600 0.328500 0.329100 0.329100 0.329100 0.329255 0.329345 49 # GPGLL
+- 0.858500 - 1.014400 1.015000 1.015000 1.015000 1.015162 1.015298 70 # GPRMC
+0.034500 - - 0.215400 0.216000 0.216000 0.216000 0.216134 0.216255 81 # GPGGA
+- - 0.220400 0.327400 0.327900 0.328000 0.328000 0.328107 0.328196 49 # GPGLL
+- 0.856300 - 1.012300 1.012900 1.012900 1.012900 1.013018 1.013154 70 # GPRMC
+0.036300 - - 0.217300 0.217800 0.217800 0.217900 0.217986 0.218106 81 # GPGGA
+- - 0.221300 0.329300 0.329800 0.329800 0.329800 0.329961 0.330052 49 # GPGLL
+- 0.858200 - 1.014200 1.014700 1.014700 1.014700 1.014873 1.015011 70 # GPRMC
+0.034200 - - 0.215100 0.215700 0.215700 0.215700 0.215849 0.215970 81 # GPGGA
+- - 0.220200 0.327100 0.327700 0.327700 0.327700 0.327837 0.327927 49 # GPGLL
+- 0.856000 - 1.012000 1.012600 1.012600 1.012600 1.012744 1.012880 70 # GPRMC
+0.034100 - - 0.215100 0.215700 0.215700 0.215700 0.215889 0.216023 81 # GPGGA
+- - 0.220000 0.327000 0.327600 0.327600 0.327600 0.327723 0.327809 49 # GPGLL
+- 0.855900 - 1.011900 1.012400 1.012400 1.012500 1.012593 1.012730 70 # GPRMC
+0.033900 - - 0.215000 0.215500 0.215600 0.215600 0.215754 0.215893 81 # GPGGA
+- - 0.218800 0.326800 0.327400 0.327400 0.327400 0.327544 0.327633 49 # GPGLL
+- 0.855700 - 1.010700 1.011300 1.011300 1.011300 1.011447 1.011583 70 # GPRMC
+0.033700 - - 0.213700 0.214200 0.214300 0.214300 0.214412 0.214533 81 # GPGGA
+- - 0.218700 0.326700 0.327200 0.327200 0.327300 0.327398 0.327486 49 # GPGLL
+- 0.855600 - 1.010700 1.011200 1.011200 1.011200 1.011434 1.011583 70 # GPRMC
+0.033600 - - 0.215600 0.216100 0.216100 0.216100 0.216275 0.216396 81 # GPGGA
+- - 0.219800 0.327500 0.328100 0.328100 0.328100 0.328245 0.328333 49 # GPGLL
+- 0.856500 - 1.012400 1.013000 1.013000 1.013000 1.013286 1.013432 70 # GPRMC
+0.033500 - - 0.214400 0.215000 0.215000 0.215000 0.215120 0.215240 81 # GPGGA
+- - 0.219400 0.326400 0.326900 0.326900 0.327000 0.327106 0.327196 49 # GPGLL
+- 0.855300 - 1.011300 1.011900 1.011900 1.011900 1.012014 1.012151 70 # GPRMC
+0.034400 - - 0.215500 0.216000 0.216000 0.216000 0.216169 0.216303 81 # GPGGA
+- - 0.219300 0.327300 0.327800 0.327800 0.327800 0.327978 0.328066 49 # GPGLL
+- 0.856200 - 1.012300 1.012900 1.012900 1.012900 1.013186 1.013321 70 # GPRMC
+0.034200 - - 0.215100 0.215700 0.215700 0.215700 0.215840 0.215961 81 # GPGGA
+- - 0.219100 0.327100 0.327700 0.327700 0.327700 0.327808 0.327895 49 # GPGLL
+- 0.856000 - 1.012100 1.012700 1.012700 1.012700 1.012908 1.013059 70 # GPRMC
+0.034000 - - 0.215000 0.215500 0.215500 0.215600 0.215699 0.215834 81 # GPGGA
+- - 0.219000 0.327200 0.327700 0.327700 0.327800 0.327900 0.328001 49 # GPGLL
+- 0.855900 - 1.010900 1.011400 1.011400 1.011400 1.011579 1.011715 70 # GPRMC
+0.032900 - - 0.213900 0.214400 0.214400 0.214400 0.214583 0.214705 81 # GPGGA
+- - 0.217800 0.325800 0.326400 0.326400 0.326400 0.326527 0.326616 49 # GPGLL
+- 0.854700 - 1.010700 1.011300 1.011300 1.011300 1.011438 1.011574 70 # GPRMC
+0.033700 - - 0.214700 0.215200 0.215300 0.215300 0.215411 0.215532 81 # GPGGA
+- - 0.219800 0.326700 0.327200 0.327200 0.327300 0.327384 0.327471 49 # GPGLL
+- 0.856600 - 1.012600 1.013100 1.013100 1.013200 1.013299 1.013435 70 # GPRMC
+0.034600 - - 0.215500 0.216100 0.216100 0.216100 0.216285 0.216407 81 # GPGGA
+- - 0.219500 0.327500 0.328100 0.328100 0.328100 0.328243 0.328332 49 # GPGLL
+- 0.856500 - 1.012400 1.013000 1.013000 1.013000 1.013149 1.013285 70 # GPRMC
+0.034500 - - 0.215400 0.216000 0.216000 0.216000 0.216119 0.216240 81 # GPGGA
+- - 0.219400 0.327400 0.327900 0.327900 0.328000 0.328098 0.328190 49 # GPGLL
+- 0.856300 - 1.012300 1.012800 1.012900 1.012900 1.013011 1.013149 70 # GPRMC
+0.034300 - - 0.215300 0.215800 0.215800 0.215800 0.215972 0.216093 81 # GPGGA
+- - 0.220300 0.328200 0.328800 0.328800 0.328800 0.328947 0.329035 49 # GPGLL
+- 0.857200 - 1.012200 1.012800 1.012800 1.012800 1.012931 1.013067 70 # GPRMC
+0.034200 - - 0.215100 0.215700 0.215700 0.215700 0.215830 0.215951 81 # GPGGA
+- - 0.220100 0.327100 0.327600 0.327600 0.327700 0.327801 0.327888 49 # GPGLL
+- 0.856000 - 1.012000 1.012600 1.012600 1.012600 1.012714 1.012850 70 # GPRMC
+0.034100 - - 0.214200 0.214800 0.214800 0.214800 0.214975 0.215096 81 # GPGGA
+- - 0.219000 0.326900 0.327500 0.327500 0.327500 0.327666 0.327755 49 # GPGLL
+- 0.855900 - 1.010900 1.011400 1.011400 1.011400 1.011584 1.011721 70 # GPRMC
+0.035900 - - 0.216800 0.217400 0.217400 0.217400 0.217567 0.217688 81 # GPGGA
+- - 0.221800 0.329800 0.330400 0.330400 0.330400 0.330515 0.330602 49 # GPGLL
+- 0.858700 - 1.013700 1.014300 1.014300 1.014300 1.014424 1.014560 70 # GPRMC
+0.032800 - - 0.214700 0.215200 0.215200 0.215300 0.215398 0.215519 81 # GPGGA
+- - 0.219800 0.327700 0.328200 0.328200 0.328200 0.328381 0.328469 49 # GPGLL
+- 0.856600 - 1.011600 1.012100 1.012100 1.012200 1.012288 1.012424 70 # GPRMC
+0.033600 - - 0.214500 0.215100 0.215100 0.215100 0.215252 0.215372 81 # GPGGA
+- - 0.219600 0.327600 0.328100 0.328200 0.328200 0.328305 0.328393 49 # GPGLL
+- 0.856500 - 1.009400 1.010000 1.010000 1.010000 1.010142 1.010278 69 # GPRMC
+0.034500 - - 0.215400 0.215900 0.215900 0.216000 0.216106 0.216227 81 # GPGGA
+- - 0.219500 0.327400 0.327900 0.327900 0.328000 0.328090 0.328186 49 # GPGLL
+- 0.856600 - 1.009300 1.009900 1.009900 1.009900 1.010061 1.010197 69 # GPRMC
diff --git a/www/performance/profile4.txt b/www/performance/profile4.txt
new file mode 100644
index 00000000..5aa981be
--- /dev/null
+++ b/www/performance/profile4.txt
@@ -0,0 +1,103 @@
+# Split latency data, Haicom 204s, 9600N1, cycle 1s
+# GPGGA GPRMC GPGLL T1 D1 W E2 T2 D2 length tag
+# --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
+- 0.420500 - 0.498200 0.498800 0.498800 0.498800 0.498942 0.499078 70 # GPRMC
+0.022200 - - 0.113100 0.113700 0.113700 0.113700 0.113839 0.113967 82 # GPGGA
+- - 0.115100 0.169100 0.169700 0.169700 0.169700 0.169891 0.170010 49 # GPGLL
+- 0.420100 - 0.497100 0.497600 0.497600 0.497700 0.497783 0.497914 70 # GPRMC
+0.021000 - - 0.113000 0.113500 0.113500 0.113600 0.113693 0.113810 82 # GPGGA
+- - 0.115200 0.169000 0.169500 0.169600 0.169600 0.169702 0.169789 49 # GPGLL
+- 0.420200 - 0.497900 0.498500 0.498500 0.498500 0.498651 0.498783 70 # GPRMC
+0.022900 - - 0.113800 0.114400 0.114400 0.114400 0.114563 0.114679 82 # GPGGA
+- - 0.117200 0.169900 0.170400 0.170400 0.170400 0.170572 0.170660 49 # GPGLL
+- 0.420800 - 0.497800 0.498300 0.498400 0.498400 0.498508 0.498640 70 # GPRMC
+0.022700 - - 0.113700 0.114300 0.114300 0.114300 0.114419 0.114537 82 # GPGGA
+- - 0.115700 0.169700 0.170300 0.170300 0.170300 0.170467 0.170555 49 # GPGLL
+- 0.419900 - 0.497600 0.498200 0.498200 0.498200 0.498363 0.498503 70 # GPRMC
+0.022600 - - 0.113600 0.114100 0.114100 0.114100 0.114274 0.114391 82 # GPGGA
+- - 0.115800 0.169600 0.170100 0.170100 0.170100 0.170277 0.170364 49 # GPGLL
+- 0.419800 - 0.497500 0.498100 0.498100 0.498100 0.498218 0.498349 70 # GPRMC
+0.022400 - - 0.114400 0.115000 0.115000 0.115000 0.115132 0.115250 82 # GPGGA
+- - 0.116400 0.170400 0.171000 0.171000 0.171000 0.171139 0.171228 49 # GPGLL
+- 0.420600 - 0.498400 0.498900 0.498900 0.499000 0.499089 0.499221 70 # GPRMC
+0.025300 - - 0.117300 0.117800 0.117800 0.117800 0.117979 0.118106 82 # GPGGA
+- - 0.119500 0.173300 0.173800 0.173800 0.173800 0.173956 0.174053 49 # GPGLL
+- 0.423500 - 0.501200 0.501800 0.501800 0.501800 0.501954 0.502095 70 # GPRMC
+0.022200 - - 0.114100 0.114700 0.114700 0.114700 0.114836 0.114953 82 # GPGGA
+- - 0.116400 0.170100 0.170700 0.170700 0.170700 0.170814 0.170901 49 # GPGLL
+- 0.420300 - 0.498100 0.498600 0.498600 0.498700 0.498781 0.498914 70 # GPRMC
+0.023000 - - 0.115000 0.115600 0.115600 0.115600 0.115722 0.115840 82 # GPGGA
+- - 0.117000 0.171000 0.171500 0.171500 0.171600 0.171681 0.171769 49 # GPGLL
+- 0.421200 - 0.498900 0.499500 0.499500 0.499500 0.499662 0.499796 70 # GPRMC
+0.028900 - - 0.118800 0.119400 0.119400 0.119400 0.119562 0.119679 81 # GPGGA
+- - 0.120800 0.174800 0.175400 0.175400 0.175400 0.175537 0.175625 49 # GPGLL
+- 0.425100 - 0.502800 0.503400 0.503400 0.503400 0.503565 0.503696 70 # GPRMC
+0.026700 - - 0.117700 0.118300 0.118300 0.118300 0.118417 0.118535 81 # GPGGA
+- - 0.120000 0.173700 0.174300 0.174300 0.174300 0.174417 0.174503 49 # GPGLL
+- 0.423900 - 0.501600 0.502200 0.502200 0.502300 0.502387 0.502519 70 # GPRMC
+0.027700 - - 0.117600 0.118100 0.118100 0.118100 0.118275 0.118416 81 # GPGGA
+- - 0.119600 0.173600 0.174100 0.174100 0.174200 0.174280 0.174367 49 # GPGLL
+- 0.423800 - 0.501500 0.502100 0.502100 0.502100 0.502223 0.502356 70 # GPRMC
+0.027400 - - 0.117400 0.118000 0.118000 0.118000 0.118136 0.118254 81 # GPGGA
+- - 0.119400 0.173400 0.174000 0.174000 0.174000 0.174186 0.174272 49 # GPGLL
+- 0.423700 - 0.501400 0.501900 0.501900 0.501900 0.502079 0.502211 70 # GPRMC
+0.027300 - - 0.117300 0.117800 0.117800 0.117900 0.117985 0.118111 81 # GPGGA
+- - 0.119300 0.173300 0.173800 0.173800 0.173900 0.173983 0.174079 49 # GPGLL
+- 0.423500 - 0.501200 0.501800 0.501800 0.501800 0.501928 0.502060 70 # GPRMC
+0.026200 - - 0.116100 0.116700 0.116700 0.116700 0.116845 0.116961 81 # GPGGA
+- - 0.119500 0.172100 0.172700 0.172700 0.172700 0.172819 0.172907 49 # GPGLL
+- 0.424100 - 0.501100 0.501600 0.501600 0.501700 0.501787 0.501919 70 # GPRMC
+0.027000 - - 0.117000 0.117500 0.117600 0.117600 0.117705 0.117823 81 # GPGGA
+- - 0.120000 0.173000 0.173500 0.173500 0.173600 0.173685 0.173772 49 # GPGLL
+- 0.424000 - 0.500900 0.501500 0.501500 0.501500 0.501641 0.501772 70 # GPRMC
+0.026900 - - 0.116800 0.117400 0.117400 0.117400 0.117562 0.117679 81 # GPGGA
+- - 0.119200 0.172800 0.173400 0.173400 0.173400 0.173540 0.173628 49 # GPGLL
+- 0.423900 - 0.500800 0.501400 0.501400 0.501400 0.501512 0.501644 70 # GPRMC
+0.032900 - - 0.123700 0.124300 0.124300 0.124300 0.124530 0.124647 81 # GPGGA
+- - 0.125700 0.179700 0.180200 0.180200 0.180300 0.180398 0.180485 49 # GPGLL
+- 0.429900 - 0.507600 0.508200 0.508200 0.508200 0.508374 0.508507 70 # GPRMC
+0.026600 - - 0.117600 0.118100 0.118100 0.118100 0.118276 0.118417 81 # GPGGA
+- - 0.119600 0.173600 0.174100 0.174100 0.174100 0.174257 0.174344 49 # GPGLL
+- 0.423800 - 0.501500 0.502100 0.502100 0.502100 0.502228 0.502359 70 # GPRMC
+0.026400 - - 0.117400 0.118000 0.118000 0.118000 0.118125 0.118251 81 # GPGGA
+- - 0.119700 0.173400 0.174000 0.174000 0.174000 0.174105 0.174201 49 # GPGLL
+- 0.423600 - 0.501400 0.501900 0.501900 0.501900 0.502077 0.502218 70 # GPRMC
+0.026300 - - 0.117300 0.117900 0.117900 0.117900 0.118008 0.118124 81 # GPGGA
+- - 0.119300 0.173300 0.173800 0.173800 0.173800 0.173963 0.174050 49 # GPGLL
+- 0.423500 - 0.501200 0.501800 0.501800 0.501800 0.501941 0.502074 70 # GPRMC
+0.027200 - - 0.117200 0.117700 0.117700 0.117700 0.117912 0.118029 81 # GPGGA
+- - 0.119100 0.173100 0.173700 0.173700 0.173700 0.173828 0.173915 49 # GPGLL
+- 0.423300 - 0.501100 0.501600 0.501600 0.501700 0.501796 0.501928 70 # GPRMC
+0.030000 - - 0.120000 0.120500 0.120600 0.120600 0.120707 0.120824 81 # GPGGA
+- - 0.122200 0.176000 0.176600 0.176600 0.176600 0.176706 0.176793 49 # GPGLL
+- 0.426900 - 0.503900 0.504500 0.504500 0.504500 0.504676 0.504808 70 # GPRMC
+0.027900 - - 0.117800 0.118400 0.118400 0.118400 0.118559 0.118677 81 # GPGGA
+- - 0.120900 0.173800 0.174400 0.174400 0.174400 0.174535 0.174622 49 # GPGLL
+- 0.425100 - 0.502800 0.503400 0.503400 0.503400 0.503517 0.503649 70 # GPRMC
+0.026700 - - 0.117700 0.118300 0.118300 0.118300 0.118428 0.118545 81 # GPGGA
+- - 0.119700 0.173700 0.174200 0.174300 0.174300 0.174401 0.174489 49 # GPGLL
+- 0.423900 - 0.501700 0.502300 0.502300 0.502300 0.502432 0.502564 70 # GPRMC
+0.027600 - - 0.117600 0.118100 0.118100 0.118100 0.118283 0.118400 81 # GPGGA
+- - 0.119600 0.173600 0.174100 0.174100 0.174100 0.174258 0.174345 49 # GPGLL
+- 0.424500 - 0.501500 0.502100 0.502100 0.502100 0.502218 0.502349 70 # GPRMC
+0.027400 - - 0.117500 0.118000 0.118000 0.118000 0.118172 0.118298 81 # GPGGA
+- - 0.119400 0.173400 0.174000 0.174000 0.174000 0.174106 0.174193 49 # GPGLL
+- 0.424400 - 0.501400 0.501900 0.502000 0.502000 0.502100 0.502241 70 # GPRMC
+0.028300 - - 0.119300 0.119800 0.119800 0.119900 0.119989 0.120107 81 # GPGGA
+- - 0.121300 0.175300 0.175800 0.175800 0.175800 0.175965 0.176051 49 # GPGLL
+- 0.425500 - 0.503200 0.503800 0.503800 0.503800 0.503942 0.504073 70 # GPRMC
+0.030200 - - 0.120100 0.120700 0.120700 0.120700 0.120851 0.120967 81 # GPGGA
+- - 0.122400 0.176100 0.176700 0.176700 0.176700 0.176830 0.176916 49 # GPGLL
+- 0.426300 - 0.504100 0.504600 0.504700 0.504700 0.504802 0.504934 70 # GPRMC
+0.027000 - - 0.118000 0.118600 0.118600 0.118600 0.118708 0.118826 81 # GPGGA
+- - 0.120300 0.174000 0.174500 0.174500 0.174600 0.174688 0.174775 49 # GPGLL
+- 0.424200 - 0.501900 0.502500 0.502500 0.502500 0.502661 0.502793 70 # GPRMC
+0.026900 - - 0.116800 0.117400 0.117400 0.117400 0.117570 0.117688 81 # GPGGA
+- - 0.119900 0.172800 0.173400 0.173400 0.173400 0.173543 0.173629 49 # GPGLL
+- 0.423800 - 0.500800 0.501400 0.501400 0.501400 0.501508 0.501639 70 # GPRMC
+0.026700 - - 0.117700 0.118300 0.118300 0.118300 0.118423 0.118540 81 # GPGGA
+- - 0.120000 0.173700 0.174200 0.174300 0.174300 0.174404 0.174491 49 # GPGLL
+- 0.423900 - 0.501700 0.502200 0.502200 0.502200 0.502376 0.502508 70 # GPRMC
+0.026600 - - 0.117600 0.118100 0.118100 0.118100 0.118281 0.118398 81 # GPGGA
+- - 0.119900 0.173600 0.174100 0.174100 0.174100 0.174252 0.174348 49 # GPGLL
+- 0.423600 - 0.501500 0.502100 0.502100 0.502100 0.502231 0.502372 70 # GPRMC
diff --git a/www/performance/profile5.txt b/www/performance/profile5.txt
new file mode 100644
index 00000000..bdae796e
--- /dev/null
+++ b/www/performance/profile5.txt
@@ -0,0 +1,103 @@
+# Split latency data, BU-303b, 4800N1, cycle 1s
+# GPGGA GPRMC GPGLL T1 D1 W E2 T2 D2 length tag
+# --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
+- 0.372400 - 0.528400 0.528500 0.528500 0.528500 0.528847 0.529094 70 # GPRMC
+0.080300 - - 0.260300 0.260400 0.260400 0.260400 0.260755 0.260995 81 # GPGGA
+- 0.376300 - 0.532200 0.532400 0.532400 0.532400 0.532710 0.533043 70 # GPRMC
+0.076300 - - 0.256200 0.256300 0.256300 0.256400 0.256695 0.256970 81 # GPGGA
+- 0.373100 - 0.529100 0.529200 0.529200 0.529300 0.529555 0.529893 70 # GPRMC
+0.076000 - - 0.256000 0.256100 0.256100 0.256200 0.256469 0.256766 81 # GPGGA
+- 0.764900 - 0.920900 0.921000 0.921000 0.921100 0.921356 0.921690 70 # GPRMC
+0.084000 - - 0.263800 0.263900 0.263900 0.264000 0.264292 0.264590 81 # GPGGA
+- 0.380800 - 0.536800 0.536900 0.536900 0.537000 0.537250 0.537585 70 # GPRMC
+0.075700 - - 0.255700 0.255800 0.255800 0.255900 0.256177 0.256450 81 # GPGGA
+- 0.372600 - 0.528600 0.528800 0.528800 0.528800 0.529096 0.529430 70 # GPRMC
+0.079600 - - 0.259500 0.259600 0.259600 0.259700 0.260012 0.260289 81 # GPGGA
+- 0.376500 - 0.531500 0.531700 0.531700 0.531700 0.532028 0.532340 70 # GPRMC
+0.076400 - - 0.256300 0.256500 0.256500 0.256600 0.256878 0.257153 81 # GPGGA
+- 0.373300 - 0.529300 0.529500 0.529500 0.529500 0.529817 0.530128 70 # GPRMC
+0.085300 - - 0.265200 0.265300 0.265300 0.265400 0.265717 0.265995 81 # GPGGA
+- 0.773100 - 0.929100 0.929200 0.929300 0.929300 0.929591 0.929899 70 # GPRMC
+0.082100 - - 0.263000 0.263200 0.263200 0.263200 0.263565 0.263838 81 # GPGGA
+- 0.380000 - 0.536000 0.536100 0.536200 0.536200 0.536513 0.536826 70 # GPRMC
+0.076000 - - 0.255900 0.256000 0.256000 0.256100 0.256409 0.256687 81 # GPGGA
+- 0.372900 - 0.527800 0.528000 0.528000 0.528000 0.528357 0.528669 70 # GPRMC
+0.078800 - - 0.258700 0.258900 0.258900 0.258900 0.259267 0.259541 81 # GPGGA
+- 0.375700 - 0.529700 0.529800 0.529800 0.529900 0.530199 0.530511 69 # GPRMC
+0.074600 - - 0.254600 0.254700 0.254700 0.254800 0.255097 0.255372 81 # GPGGA
+- 0.371600 - 0.526500 0.526700 0.526700 0.526700 0.527056 0.527367 70 # GPRMC
+0.076500 - - 0.256400 0.256600 0.256600 0.256600 0.256966 0.257242 81 # GPGGA
+- 0.764400 - 0.920300 0.920500 0.920500 0.920500 0.920825 0.921132 70 # GPRMC
+0.092300 - - 0.273300 0.273400 0.273400 0.273500 0.273788 0.274060 81 # GPGGA
+- 0.390300 - 0.545500 0.545700 0.545700 0.545700 0.546197 0.546528 70 # GPRMC
+0.078200 - - 0.258100 0.258300 0.258300 0.258300 0.258656 0.258930 81 # GPGGA
+- 0.375100 - 0.531100 0.531200 0.531200 0.531300 0.531596 0.531908 70 # GPRMC
+0.078000 - - 0.258000 0.258100 0.258100 0.258200 0.258493 0.258768 81 # GPGGA
+- 0.375000 - 0.530900 0.531100 0.531100 0.531100 0.531442 0.531755 70 # GPRMC
+0.075900 - - 0.255800 0.256000 0.256000 0.256000 0.256347 0.256622 81 # GPGGA
+- 0.372800 - 0.528800 0.528900 0.528900 0.529000 0.529284 0.529593 70 # GPRMC
+0.075700 - - 0.255700 0.255800 0.255800 0.255900 0.256185 0.256461 81 # GPGGA
+- 0.764600 - 0.919600 0.919700 0.919700 0.919800 0.920060 0.920366 70 # GPRMC
+0.082600 - - 0.263500 0.263700 0.263700 0.263700 0.264040 0.264314 81 # GPGGA
+- 0.380500 - 0.536500 0.536600 0.536600 0.536700 0.536982 0.537296 70 # GPRMC
+0.076400 - - 0.256400 0.256500 0.256500 0.256600 0.256880 0.257158 81 # GPGGA
+- 0.373400 - 0.524300 0.524500 0.524500 0.524500 0.524825 0.525139 68 # GPRMC
+0.079300 - - 0.259200 0.259400 0.259400 0.259400 0.259737 0.260012 81 # GPGGA
+- 0.376200 - 0.532200 0.532400 0.532400 0.532500 0.532752 0.533065 70 # GPRMC
+0.076100 - - 0.256100 0.256200 0.256200 0.256300 0.256580 0.256857 81 # GPGGA
+- 0.373100 - 0.529000 0.529200 0.529200 0.529200 0.529524 0.529837 70 # GPRMC
+0.080000 - - 0.259900 0.260100 0.260100 0.260100 0.260434 0.260709 81 # GPGGA
+- 0.768800 - 0.924800 0.925000 0.925000 0.925000 0.925306 0.925613 70 # GPRMC
+0.078800 - - 0.259800 0.259900 0.259900 0.259900 0.260265 0.260537 81 # GPGGA
+- 0.376800 - 0.532700 0.532900 0.532900 0.532900 0.533222 0.533535 70 # GPRMC
+0.076700 - - 0.256600 0.256800 0.256800 0.256800 0.257138 0.257413 81 # GPGGA
+- 0.373600 - 0.529600 0.529700 0.529700 0.529800 0.530070 0.530383 70 # GPRMC
+0.079500 - - 0.259400 0.259600 0.259600 0.259700 0.259972 0.260247 81 # GPGGA
+- 0.376400 - 0.532400 0.532500 0.532600 0.532600 0.532909 0.533220 70 # GPRMC
+0.075400 - - 0.255300 0.255400 0.255500 0.255500 0.255819 0.256094 81 # GPGGA
+- 0.372300 - 0.528300 0.528400 0.528400 0.528500 0.528777 0.529092 70 # GPRMC
+0.076200 - - 0.256100 0.256300 0.256300 0.256400 0.256672 0.256948 81 # GPGGA
+- 0.764100 - 0.920000 0.920200 0.920200 0.920300 0.920531 0.920837 70 # GPRMC
+0.079100 - - 0.260000 0.260200 0.260200 0.260200 0.260518 0.260792 81 # GPGGA
+- 0.377000 - 0.532900 0.533100 0.533100 0.533200 0.533459 0.533773 70 # GPRMC
+0.075900 - - 0.255800 0.256000 0.256000 0.256000 0.256357 0.256634 81 # GPGGA
+- 0.372800 - 0.528900 0.529100 0.529100 0.529100 0.529480 0.529813 70 # GPRMC
+0.080700 - - 0.260700 0.260900 0.260900 0.260900 0.261210 0.261484 81 # GPGGA
+- 0.377700 - 0.533600 0.533800 0.533800 0.533900 0.534160 0.534470 70 # GPRMC
+0.076600 - - 0.256500 0.256700 0.256700 0.256700 0.257056 0.257332 81 # GPGGA
+- 0.373500 - 0.529500 0.529600 0.529600 0.529700 0.529982 0.530294 70 # GPRMC
+0.076400 - - 0.256400 0.256600 0.256600 0.256600 0.256907 0.257182 81 # GPGGA
+- 0.765300 - 0.921300 0.921400 0.921500 0.921500 0.921768 0.922075 70 # GPRMC
+0.079300 - - 0.260200 0.260400 0.260400 0.260400 0.260738 0.261012 81 # GPGGA
+- 0.377200 - 0.533200 0.533300 0.533300 0.533400 0.533684 0.533997 70 # GPRMC
+0.080100 - - 0.260100 0.260200 0.260200 0.260300 0.260597 0.260872 81 # GPGGA
+- 0.377100 - 0.533000 0.533200 0.533200 0.533200 0.533522 0.533835 70 # GPRMC
+0.081000 - - 0.260900 0.261100 0.261100 0.261100 0.261442 0.261717 81 # GPGGA
+- 0.377900 - 0.532900 0.533000 0.533000 0.533100 0.533380 0.533693 70 # GPRMC
+0.076800 - - 0.256800 0.256900 0.256900 0.257000 0.257298 0.257574 81 # GPGGA
+- 0.373800 - 0.528700 0.528900 0.528900 0.528900 0.529223 0.529533 70 # GPRMC
+0.075700 - - 0.255600 0.255800 0.255800 0.255800 0.256136 0.256411 81 # GPGGA
+- 0.763600 - 0.919500 0.919700 0.919700 0.919700 0.920004 0.920309 70 # GPRMC
+0.078500 - - 0.259500 0.259600 0.259600 0.259700 0.259974 0.260246 81 # GPGGA
+- 0.376500 - 0.532400 0.532600 0.532600 0.532600 0.532917 0.533227 70 # GPRMC
+0.076400 - - 0.256300 0.256500 0.256500 0.256500 0.256839 0.257114 81 # GPGGA
+- 0.373300 - 0.528300 0.528400 0.528400 0.528500 0.528764 0.529076 70 # GPRMC
+0.075200 - - 0.255200 0.255300 0.255300 0.255400 0.255672 0.255947 81 # GPGGA
+- 0.372200 - 0.528100 0.528200 0.528300 0.528300 0.528589 0.528901 70 # GPRMC
+0.075100 - - 0.255000 0.255100 0.255100 0.255200 0.255494 0.255770 81 # GPGGA
+- 0.372000 - 0.528000 0.528100 0.528100 0.528200 0.528448 0.528760 70 # GPRMC
+0.075900 - - 0.256900 0.257000 0.257000 0.257100 0.257357 0.257631 81 # GPGGA
+- 0.765000 - 0.920700 0.920900 0.920900 0.921000 0.921223 0.921532 70 # GPRMC
+0.087800 - - 0.268700 0.268800 0.268900 0.268900 0.269194 0.269466 81 # GPGGA
+- 0.385700 - 0.540700 0.540800 0.540800 0.540900 0.541143 0.541454 70 # GPRMC
+0.078600 - - 0.259500 0.259700 0.259700 0.259700 0.260050 0.260324 81 # GPGGA
+- 0.375500 - 0.531500 0.531700 0.531700 0.531700 0.531996 0.532308 70 # GPRMC
+0.076500 - - 0.256400 0.256500 0.256500 0.256600 0.256888 0.257165 81 # GPGGA
+- 0.373400 - 0.528400 0.528500 0.528500 0.528500 0.528840 0.529151 70 # GPRMC
+0.076400 - - 0.256200 0.256400 0.256400 0.256400 0.256746 0.257022 81 # GPGGA
+- 0.373200 - 0.529200 0.529300 0.529300 0.529400 0.529681 0.529992 70 # GPRMC
+0.076100 - - 0.256100 0.256200 0.256200 0.256300 0.256580 0.256855 81 # GPGGA
+- 0.765000 - 0.920000 0.920100 0.920100 0.920200 0.920457 0.920762 70 # GPRMC
+0.076000 - - 0.256900 0.257100 0.257100 0.257100 0.257438 0.257709 81 # GPGGA
+- 0.372900 - 0.528900 0.529000 0.529000 0.529100 0.529387 0.529699 70 # GPRMC
+0.075800 - - 0.255800 0.255900 0.255900 0.256000 0.256276 0.256552 81 # GPGGA