Skip to content

Instantly share code, notes, and snippets.

@mottosso
Last active January 9, 2020 06:40
Show Gist options
  • Save mottosso/dd59f815025e4d76f453f3555e39558e to your computer and use it in GitHub Desktop.
Save mottosso/dd59f815025e4d76f453f3555e39558e to your computer and use it in GitHub Desktop.
Subprocess profiling

Table of contents


Usage

In Python 2 or 3 on any platform

$ python -u subprocess_profile.py --bytes=100 --iterations=1000

Results on Python 2.7 on play-with-docker:

$ docker run -ti --rm ubuntu
(ubuntu) $ apt-get update && apt-get install python
(ubuntu) $ python -u subprocess_profile.py --bytes=1 --iterations=10000
...
Iterations: 10,000
Bytes/iteration: 76 b/i
Bytes/second: 1,982,766 b/s
Avarage roundtrip time: 0.016 ms
Min roundtrip time: 0.002 ms
Max roundtrip time: 0.202 ms
Delta roundtrip time: 0.200 ms
Total bytes: 760,000 b
Total time: 0.383 s

Aggregate results

The second snippet runs the first many times, aggregating their results.

$ python subprocess_aggregate.py
...

10 minutes later

Producing a plot like aggplot.svg

Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" class="pygal-chart" id="chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09" viewBox="0 0 2000 500" xmlns="http://www.w3.org/2000/svg"><!--Generated with pygal 2.4.0 (etree) ©Kozea 2012-2016 on 2018-04-29--><!--http://pygal.org--><!--http://github.com/Kozea/pygal--><defs><style type="text/css">#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09{-webkit-user-select:none;-webkit-font-smoothing:antialiased;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .title{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .legends .legend text{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:14px}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis text{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis text.major{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .text-overlay text.value{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .text-overlay text.label{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:14px}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 text.no_data{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:64px}
#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09{background-color:rgba(249,249,249,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 path,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 rect,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 circle{-webkit-transition:150ms;-moz-transition:150ms;transition:150ms}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .graph &gt; .background{fill:rgba(249,249,249,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .plot &gt; .background{fill:rgba(255,255,255,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .graph{fill:rgba(0,0,0,.87)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 text.no_data{fill:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .title{fill:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .legends .legend text{fill:rgba(0,0,0,.87)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .legends .legend:hover text{fill:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis .line{stroke:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis .guide.line{stroke:rgba(0,0,0,.54)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis .major.line{stroke:rgba(0,0,0,.87)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis text.major{fill:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.y .guides:hover .guide.line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .line-graph .axis.x .guides:hover .guide.line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .stackedline-graph .axis.x .guides:hover .guide.line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .xy-graph .axis.x .guides:hover .guide.line{stroke:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis .guides:hover text{fill:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .reactive{fill-opacity:.7;stroke-opacity:.8}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .ci{stroke:rgba(0,0,0,.87)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .reactive.active,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .active .reactive{fill-opacity:.8;stroke-opacity:.9;stroke-width:4}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .ci .reactive.active{stroke-width:1.5}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .series text{fill:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip rect{fill:rgba(255,255,255,1);stroke:rgba(0,0,0,1);-webkit-transition:opacity 150ms;-moz-transition:opacity 150ms;transition:opacity 150ms}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip .label{fill:rgba(0,0,0,.87)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip .label{fill:rgba(0,0,0,.87)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip .legend{font-size:.8em;fill:rgba(0,0,0,.54)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip .x_label{font-size:.6em;fill:rgba(0,0,0,1)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip .xlink{font-size:.5em;text-decoration:underline}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip .value{font-size:1.5em}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .bound{font-size:.5em}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .max-value{font-size:.75em;fill:rgba(0,0,0,.54)}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .map-element{fill:rgba(255,255,255,1);stroke:rgba(0,0,0,.54) !important}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .map-element .reactive{fill-opacity:inherit;stroke-opacity:inherit}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .color-0,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .color-0 a:visited{stroke:#F44336;fill:#F44336}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .color-1,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .color-1 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .color-2,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .color-2 a:visited{stroke:#009688;fill:#009688}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .text-overlay .color-0 text{fill:black}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .text-overlay .color-1 text{fill:black}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .text-overlay .color-2 text{fill:black}
#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 text.no_data{text-anchor:middle}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .guide.line{fill:none}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .centered{text-anchor:middle}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .title{text-anchor:middle}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .legends .legend text{fill-opacity:1}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.x text{text-anchor:middle}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.x:not(.web) text[transform]{text-anchor:start}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.x:not(.web) text[transform].backwards{text-anchor:end}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.y text{text-anchor:end}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.y text[transform].backwards{text-anchor:start}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.y2 text{text-anchor:start}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.y2 text[transform].backwards{text-anchor:end}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis .guide.line{stroke-dasharray:4,4}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis .major.guide.line{stroke-dasharray:6,6}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .horizontal .axis.y .guide.line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .horizontal .axis.y2 .guide.line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .vertical .axis.x .guide.line{opacity:0}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .horizontal .axis.always_show .guide.line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .vertical .axis.always_show .guide.line{opacity:1 !important}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.y .guides:hover .guide.line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.y2 .guides:hover .guide.line,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis.x .guides:hover .guide.line{opacity:1}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .axis .guides:hover text{opacity:1}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .nofill{fill:none}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .subtle-fill{fill-opacity:.2}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .dot{stroke-width:1px;fill-opacity:1}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .dot.active{stroke-width:5px}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .dot.negative{fill:transparent}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 text,#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 tspan{stroke:none !important}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .series text.active{opacity:1}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip rect{fill-opacity:.95;stroke-width:.5}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .tooltip text{fill-opacity:1}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .showable{visibility:hidden}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .showable.shown{visibility:visible}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .gauge-background{fill:rgba(229,229,229,1);stroke:none}#chart-c04ae534-76c6-4e2e-924f-bdbdc368aa09 .bg-lines{stroke:rgba(249,249,249,1);stroke-width:2px}</style><script type="text/javascript">window.pygal = window.pygal || {};window.pygal.config = window.pygal.config || {};window.pygal.config['c04ae534-76c6-4e2e-924f-bdbdc368aa09'] = {"allow_interruptions": false, "box_mode": "extremes", "classes": ["pygal-chart"], "css": ["file://style.css", "file://graph.css"], "defs": [], "disable_xml_declaration": false, "dots_size": 2.5, "dynamic_print_values": false, "explicit_size": false, "fill": false, "force_uri_protocol": "https", "formatter": null, "half_pie": false, "height": 500, "include_x_axis": false, "inner_radius": 0, "interpolate": null, "interpolation_parameters": {}, "interpolation_precision": 250, "inverse_y_axis": false, "js": ["//kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js"], "legend_at_bottom": false, "legend_at_bottom_columns": null, "legend_box_size": 12, "logarithmic": false, "margin": 20, "margin_bottom": null, "margin_left": null, "margin_right": null, "margin_top": null, "max_scale": 16, "min_scale": 4, "missing_value_fill_truncation": "x", "no_data_text": "No data", "no_prefix": false, "order_min": null, "pretty_print": false, "print_labels": false, "print_values": false, "print_values_position": "center", "print_zeroes": true, "range": null, "rounded_bars": null, "secondary_range": null, "show_dots": true, "show_legend": true, "show_minor_x_labels": true, "show_minor_y_labels": true, "show_only_major_dots": false, "show_x_guides": false, "show_x_labels": true, "show_y_guides": true, "show_y_labels": true, "spacing": 10, "stack_from_top": false, "strict": false, "stroke": true, "stroke_style": null, "style": {"background": "rgba(249, 249, 249, 1)", "ci_colors": [], "colors": ["#F44336", "#3F51B5", "#009688", "#FFC107", "#FF5722", "#9C27B0", "#03A9F4", "#8BC34A", "#FF9800", "#E91E63", "#2196F3", "#4CAF50", "#FFEB3B", "#673AB7", "#00BCD4", "#CDDC39", "#9E9E9E", "#607D8B"], "font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "foreground": "rgba(0, 0, 0, .87)", "foreground_strong": "rgba(0, 0, 0, 1)", "foreground_subtle": "rgba(0, 0, 0, .54)", "guide_stroke_dasharray": "4,4", "label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "label_font_size": 10, "legend_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "legend_font_size": 14, "major_guide_stroke_dasharray": "6,6", "major_label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "major_label_font_size": 10, "no_data_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "no_data_font_size": 64, "opacity": ".7", "opacity_hover": ".8", "plot_background": "rgba(255, 255, 255, 1)", "stroke_opacity": ".8", "stroke_opacity_hover": ".9", "title_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "title_font_size": 16, "tooltip_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "tooltip_font_size": 14, "transition": "150ms", "value_background": "rgba(229, 229, 229, 1)", "value_colors": [], "value_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "value_font_size": 16, "value_label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "value_label_font_size": 10}, "title": "Time per iteration", "tooltip_border_radius": 0, "tooltip_fancy_mode": true, "truncate_label": null, "truncate_legend": null, "width": 2000, "x_label_rotation": 0, "x_labels": null, "x_labels_major": null, "x_labels_major_count": null, "x_labels_major_every": null, "x_title": null, "xrange": null, "y_label_rotation": 0, "y_labels": null, "y_labels_major": null, "y_labels_major_count": null, "y_labels_major_every": null, "y_title": null, "zero": 0, "legends": ["Roundtrip (ms)", "Write to child (ms)", "Child wait (ms)"]}</script><script type="text/javascript" xlink:href="https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js" /></defs><title>Time per iteration</title><g class="graph line-graph vertical"><rect class="background" height="500" width="2000" x="0" y="0" /><g class="plot" transform="translate(202, 46)"><rect class="background" height="434" width="1778.0" x="0" y="0" /><g class="axis y always_show"><g class="guides"><path class="axis major line" d="M0.000000 425.653846 h1778.000000" /><text class="major" x="-5" y="429.15384615384613">0</text><title>0</title></g><g class="guides"><path class="guide line" d="M0.000000 385.150433 h1778.000000" /><text class="" x="-5" y="388.6504328506787">0.02</text><title>0.02</title></g><g class="guides"><path class="guide line" d="M0.000000 344.647020 h1778.000000" /><text class="" x="-5" y="348.1470195475113">0.04</text><title>0.04</title></g><g class="guides"><path class="guide line" d="M0.000000 304.143606 h1778.000000" /><text class="" x="-5" y="307.6436062443439">0.06</text><title>0.06</title></g><g class="guides"><path class="guide line" d="M0.000000 263.640193 h1778.000000" /><text class="" x="-5" y="267.14019294117645">0.08</text><title>0.08</title></g><g class="guides"><path class="guide line" d="M0.000000 223.136780 h1778.000000" /><text class="" x="-5" y="226.63677963800902">0.1</text><title>0.1</title></g><g class="guides"><path class="guide line" d="M0.000000 182.633366 h1778.000000" /><text class="" x="-5" y="186.1333663348416">0.12</text><title>0.12</title></g><g class="guides"><path class="guide line" d="M0.000000 142.129953 h1778.000000" /><text class="" x="-5" y="145.62995303167412">0.14</text><title>0.14</title></g><g class="guides"><path class="guide line" d="M0.000000 101.626540 h1778.000000" /><text class="" x="-5" y="105.12653972850677">0.16</text><title>0.16</title></g><g class="guides"><path class="guide line" d="M0.000000 61.123126 h1778.000000" /><text class="" x="-5" y="64.62312642533931">0.18</text><title>0.18</title></g><g class="guides"><path class="guide line" d="M0.000000 20.619713 h1778.000000" /><text class="" x="-5" y="24.119713122171845">0.2</text><title>0.2</title></g></g><g class="series serie-0 color-0"><path class="line reactive nofill" d="M34.192308 8.346154 L35.903634 86.898190 37.614961 93.771493 39.326288 91.807692 41.037615 79.042986 42.748941 105.554299 44.460268 81.988688 46.171595 102.608597 47.882921 90.825792 49.594248 85.916290 51.305575 96.717195 53.016902 105.554299 54.728228 104.572398 56.439555 215.527149 58.150882 218.472851 59.862208 241.056561 61.573535 104.572398 63.284862 121.264706 64.996188 195.889140 66.707515 130.101810 68.418842 122.246606 70.130169 117.337104 71.841495 118.319005 73.552822 121.264706 75.264149 135.011312 76.975475 100.644796 78.686802 98.680995 80.398129 116.355204 82.109456 200.798643 83.820782 158.576923 85.532109 184.106335 87.243436 181.160633 88.954762 176.251131 90.666089 188.033937 92.377416 249.893665 94.088743 167.414027 95.800069 187.052036 97.511396 180.178733 99.222723 177.233032 100.934049 187.052036 102.645376 262.658371 104.356703 255.785068 106.068030 172.323529 107.779356 179.196833 109.490683 168.395928 111.202010 183.124434 112.913336 181.160633 114.624663 245.966063 116.335990 167.414027 118.047317 189.997738 119.758643 191.961538 121.469970 225.346154 123.181297 227.309955 124.892623 265.604072 126.603950 256.766968 128.315277 215.527149 130.026604 212.581448 131.737930 273.459276 133.449257 118.319005 135.160584 272.477376 136.871910 246.947964 138.583237 315.680995 140.294564 302.916290 142.005891 276.404977 143.717217 281.314480 145.428544 270.513575 147.139871 282.296380 148.851197 279.350679 150.562524 281.314480 152.273851 292.115385 153.985177 281.314480 155.696504 341.210407 157.407831 340.228507 159.119158 321.572398 160.830484 286.223982 162.541811 280.332579 164.253138 292.115385 165.964464 281.314480 167.675791 285.242081 169.387118 281.314480 171.098445 292.115385 172.809771 341.210407 174.521098 342.192308 176.232425 341.210407 177.943751 341.210407 179.655078 337.282805 181.366405 342.192308 183.077732 342.192308 184.789058 341.210407 186.500385 336.300905 188.211712 342.192308 189.923038 341.210407 191.634365 341.210407 193.345692 342.192308 195.057019 341.210407 196.768345 341.210407 198.479672 341.210407 200.190999 341.210407 201.902325 342.192308 203.613652 340.228507 205.324979 337.282805 207.036306 341.210407 208.747632 342.192308 210.458959 341.210407 212.170286 340.228507 213.881612 337.282805 215.592939 341.210407 217.304266 341.210407 219.015593 341.210407 220.726919 341.210407 222.438246 341.210407 224.149573 342.192308 225.860899 341.210407 227.572226 341.210407 229.283553 342.192308 230.994879 337.282805 232.706206 341.210407 234.417533 342.192308 236.128860 342.192308 237.840186 342.192308 239.551513 342.192308 241.262840 336.300905 242.974166 341.210407 244.685493 341.210407 246.396820 341.210407 248.108147 341.210407 249.819473 340.228507 251.530800 341.210407 253.242127 341.210407 254.953453 342.192308 256.664780 205.708145 258.376107 208.653846 260.087434 235.165158 261.798760 251.857466 263.510087 256.766968 265.221414 255.785068 266.932740 255.785068 268.644067 248.911765 270.355394 254.803167 272.066721 249.893665 273.778047 254.803167 275.489374 258.730769 277.200701 259.712670 278.912027 273.459276 280.623354 273.459276 282.334681 234.183258 284.046008 232.219457 285.757334 330.409502 287.468661 337.282805 289.179988 337.282805 290.891314 339.246606 292.602641 339.246606 294.313968 340.228507 296.025295 336.300905 297.736621 341.210407 299.447948 309.789593 301.159275 332.373303 302.870601 338.264706 304.581928 339.246606 306.293255 340.228507 308.004582 340.228507 309.715908 341.210407 311.427235 340.228507 313.138562 335.319005 314.849888 337.282805 316.561215 339.246606 318.272542 341.210407 319.983868 340.228507 321.695195 341.210407 323.406522 336.300905 325.117849 340.228507 326.829175 149.739819 328.540502 286.223982 330.251829 319.608597 331.963155 324.518100 333.674482 323.536199 335.385809 325.500000 337.097136 322.554299 338.808462 296.042986 340.519789 303.898190 342.231116 331.391403 343.942442 338.264706 345.653769 340.228507 347.365096 340.228507 349.076423 334.337104 350.787749 340.228507 352.499076 340.228507 354.210403 326.481900 355.921729 339.246606 357.633056 339.246606 359.344383 340.228507 361.055710 340.228507 362.767036 340.228507 364.478363 340.228507 366.189690 340.228507 367.901016 340.228507 369.612343 340.228507 371.323670 341.210407 373.034997 339.246606 374.746323 340.228507 376.457650 335.319005 378.168977 340.228507 379.880303 339.246606 381.591630 340.228507 383.302957 340.228507 385.014284 341.210407 386.725610 339.246606 388.436937 341.210407 390.148264 340.228507 391.859590 341.210407 393.570917 340.228507 395.282244 341.210407 396.993570 340.228507 398.704897 340.228507 400.416224 340.228507 402.127551 339.246606 403.838877 334.337104 405.550204 340.228507 407.261531 341.210407 408.972857 340.228507 410.684184 340.228507 412.395511 340.228507 414.106838 341.210407 415.818164 340.228507 417.529491 340.228507 419.240818 340.228507 420.952144 340.228507 422.663471 340.228507 424.374798 340.228507 426.086125 340.228507 427.797451 341.210407 429.508778 340.228507 431.220105 335.319005 432.931431 340.228507 434.642758 339.246606 436.354085 339.246606 438.065412 341.210407 439.776738 341.210407 441.488065 340.228507 443.199392 341.210407 444.910718 339.246606 446.622045 341.210407 448.333372 340.228507 450.044699 340.228507 451.756025 340.228507 453.467352 340.228507 455.178679 336.300905 456.890005 339.246606 458.601332 334.337104 460.312659 340.228507 462.023986 340.228507 463.735312 340.228507 465.446639 340.228507 467.157966 341.210407 468.869292 340.228507 470.580619 341.210407 472.291946 340.228507 474.003273 340.228507 475.714599 339.246606 477.425926 339.246606 479.137253 340.228507 480.848579 329.427602 482.559906 340.228507 484.271233 340.228507 485.982559 335.319005 487.693886 341.210407 489.405213 339.246606 491.116540 339.246606 492.827866 340.228507 494.539193 340.228507 496.250520 340.228507 497.961846 340.228507 499.673173 338.264706 501.384500 340.228507 503.095827 245.966063 504.807153 274.441176 506.518480 318.626697 508.229807 328.445701 509.941133 329.427602 511.652460 322.554299 513.363787 315.680995 515.075114 321.572398 516.786440 327.463801 518.497767 317.644796 520.209094 313.717195 521.920420 305.861991 523.631747 292.115385 525.343074 311.753394 527.054401 316.662896 528.765727 338.264706 530.477054 337.282805 532.188381 339.246606 533.899707 193.925339 535.611034 337.282805 537.322361 341.210407 539.033688 341.210407 540.745014 335.319005 542.456341 340.228507 544.167668 341.210407 545.878994 332.373303 547.590321 340.228507 549.301648 341.210407 551.012975 342.192308 552.724301 342.192308 554.435628 341.210407 556.146955 342.192308 557.858281 341.210407 559.569608 340.228507 561.280935 340.228507 562.992261 342.192308 564.703588 340.228507 566.414915 341.210407 568.126242 336.300905 569.837568 342.192308 571.548895 340.228507 573.260222 341.210407 574.971548 342.192308 576.682875 340.228507 578.394202 342.192308 580.105529 342.192308 581.816855 342.192308 583.528182 342.192308 585.239509 342.192308 586.950835 342.192308 588.662162 341.210407 590.373489 341.210407 592.084816 341.210407 593.796142 341.210407 595.507469 337.282805 597.218796 189.015837 598.930122 224.364253 600.641449 326.481900 602.352776 312.735294 604.064103 329.427602 605.775429 341.210407 607.486756 340.228507 609.198083 340.228507 610.909409 341.210407 612.620736 341.210407 614.332063 341.210407 616.043390 341.210407 617.754716 342.192308 619.466043 342.192308 621.177370 341.210407 622.888696 298.006787 624.600023 332.373303 626.311350 338.264706 628.022677 339.246606 629.734003 340.228507 631.445330 341.210407 633.156657 339.246606 634.867983 340.228507 636.579310 341.210407 638.290637 341.210407 640.001964 341.210407 641.713290 341.210407 643.424617 341.210407 645.135944 341.210407 646.847270 335.319005 648.558597 340.228507 650.269924 335.319005 651.981250 340.228507 653.692577 342.192308 655.403904 341.210407 657.115231 341.210407 658.826557 340.228507 660.537884 341.210407 662.249211 341.210407 663.960537 341.210407 665.671864 341.210407 667.383191 341.210407 669.094518 340.228507 670.805844 341.210407 672.517171 335.319005 674.228498 341.210407 675.939824 341.210407 677.651151 337.282805 679.362478 341.210407 681.073805 341.210407 682.785131 341.210407 684.496458 341.210407 686.207785 341.210407 687.919111 342.192308 689.630438 341.210407 691.341765 341.210407 693.053092 340.228507 694.764418 341.210407 696.475745 341.210407 698.187072 334.337104 699.898398 341.210407 701.609725 341.210407 703.321052 341.210407 705.032379 336.300905 706.743705 341.210407 708.455032 341.210407 710.166359 340.228507 711.877685 341.210407 713.589012 342.192308 715.300339 342.192308 717.011666 340.228507 718.722992 341.210407 720.434319 341.210407 722.145646 322.554299 723.856972 327.463801 725.568299 330.409502 727.279626 329.427602 728.990952 327.463801 730.702279 329.427602 732.413606 322.554299 734.124933 318.626697 735.836259 220.436652 737.547586 311.753394 739.258913 335.319005 740.970239 336.300905 742.681566 334.337104 744.392893 335.319005 746.104220 337.282805 747.815546 332.373303 749.526873 324.518100 751.238200 323.536199 752.949526 292.115385 754.660853 316.662896 756.372180 318.626697 758.083507 315.680995 759.794833 339.246606 761.506160 337.282805 763.217487 326.481900 764.928813 339.246606 766.640140 342.192308 768.351467 341.210407 770.062794 341.210407 771.774120 342.192308 773.485447 342.192308 775.196774 341.210407 776.908100 342.192308 778.619427 342.192308 780.330754 342.192308 782.042081 342.192308 783.753407 342.192308 785.464734 331.391403 787.176061 341.210407 788.887387 342.192308 790.598714 342.192308 792.310041 342.192308 794.021368 341.210407 795.732694 340.228507 797.444021 341.210407 799.155348 341.210407 800.866674 342.192308 802.578001 342.192308 804.289328 342.192308 806.000655 341.210407 807.711981 342.192308 809.423308 342.192308 811.134635 337.282805 812.845961 336.300905 814.557288 341.210407 816.268615 341.210407 817.979941 342.192308 819.691268 341.210407 821.402595 342.192308 823.113922 341.210407 824.825248 342.192308 826.536575 341.210407 828.247902 342.192308 829.959228 342.192308 831.670555 342.192308 833.381882 342.192308 835.093209 342.192308 836.804535 338.264706 838.515862 341.210407 840.227189 336.300905 841.938515 341.210407 843.649842 342.192308 845.361169 342.192308 847.072496 342.192308 848.783822 342.192308 850.495149 341.210407 852.206476 341.210407 853.917802 341.210407 855.629129 342.192308 857.340456 342.192308 859.051783 342.192308 860.763109 341.210407 862.474436 338.264706 864.185763 342.192308 865.897089 341.210407 867.608416 337.282805 869.319743 341.210407 871.031070 341.210407 872.742396 342.192308 874.453723 341.210407 876.165050 342.192308 877.876376 342.192308 879.587703 342.192308 881.299030 342.192308 883.010357 342.192308 884.721683 342.192308 886.433010 342.192308 888.144337 337.282805 889.855663 341.210407 891.566990 343.174208 893.278317 342.192308 894.989643 336.300905 896.700970 341.210407 898.412297 342.192308 900.123624 341.210407 901.834950 341.210407 903.546277 342.192308 905.257604 343.174208 906.968930 343.174208 908.680257 342.192308 910.391584 342.192308 912.102911 342.192308 913.814237 339.246606 915.525564 342.192308 917.236891 341.210407 918.948217 342.192308 920.659544 341.210407 922.370871 336.300905 924.082198 342.192308 925.793524 342.192308 927.504851 342.192308 929.216178 342.192308 930.927504 341.210407 932.638831 341.210407 934.350158 342.192308 936.061485 342.192308 937.772811 342.192308 939.484138 338.264706 941.195465 341.210407 942.906791 342.192308 944.618118 342.192308 946.329445 342.192308 948.040772 342.192308 949.752098 337.282805 951.463425 342.192308 953.174752 342.192308 954.886078 343.174208 956.597405 343.174208 958.308732 342.192308 960.020059 342.192308 961.731385 341.210407 963.442712 341.210407 965.154039 277.386878 966.865365 236.147059 968.576692 299.970588 970.288019 334.337104 971.999345 338.264706 973.710672 341.210407 975.421999 341.210407 977.133326 336.300905 978.844652 341.210407 980.555979 341.210407 982.267306 341.210407 983.978632 341.210407 985.689959 341.210407 987.401286 341.210407 989.112613 337.282805 990.823939 341.210407 992.535266 341.210407 994.246593 341.210407 995.957919 341.210407 997.669246 341.210407 999.380573 341.210407 1001.091900 340.228507 1002.803226 342.192308 1004.514553 335.319005 1006.225880 341.210407 1007.937206 342.192308 1009.648533 342.192308 1011.359860 342.192308 1013.071187 341.210407 1014.782513 336.300905 1016.493840 341.210407 1018.205167 341.210407 1019.916493 341.210407 1021.627820 341.210407 1023.339147 341.210407 1025.050474 340.228507 1026.761800 340.228507 1028.473127 341.210407 1030.184454 341.210407 1031.895780 336.300905 1033.607107 341.210407 1035.318434 343.174208 1037.029761 341.210407 1038.741087 342.192308 1040.452414 336.300905 1042.163741 341.210407 1043.875067 341.210407 1045.586394 341.210407 1047.297721 341.210407 1049.009048 341.210407 1050.720374 341.210407 1052.431701 341.210407 1054.143028 341.210407 1055.854354 340.228507 1057.565681 341.210407 1059.277008 336.300905 1060.988334 341.210407 1062.699661 341.210407 1064.410988 341.210407 1066.122315 337.282805 1067.833641 341.210407 1069.544968 341.210407 1071.256295 341.210407 1072.967621 341.210407 1074.678948 341.210407 1076.390275 341.210407 1078.101602 341.210407 1079.812928 342.192308 1081.524255 342.192308 1083.235582 342.192308 1084.946908 340.228507 1086.658235 336.300905 1088.369562 341.210407 1090.080889 342.192308 1091.792215 336.300905 1093.503542 341.210407 1095.214869 340.228507 1096.926195 341.210407 1098.637522 341.210407 1100.348849 341.210407 1102.060176 341.210407 1103.771502 342.192308 1105.482829 341.210407 1107.194156 341.210407 1108.905482 341.210407 1110.616809 341.210407 1112.328136 342.192308 1114.039463 336.300905 1115.750789 341.210407 1117.462116 338.264706 1119.173443 340.228507 1120.884769 342.192308 1122.596096 341.210407 1124.307423 341.210407 1126.018750 341.210407 1127.730076 341.210407 1129.441403 321.572398 1131.152730 320.590498 1132.864056 265.604072 1134.575383 296.042986 1136.286710 330.409502 1137.998036 329.427602 1139.709363 339.246606 1141.420690 335.319005 1143.132017 340.228507 1144.843343 341.210407 1146.554670 340.228507 1148.265997 341.210407 1149.977323 341.210407 1151.688650 341.210407 1153.399977 341.210407 1155.111304 341.210407 1156.822630 341.210407 1158.533957 342.192308 1160.245284 340.228507 1161.956610 341.210407 1163.667937 333.355204 1165.379264 341.210407 1167.090591 342.192308 1168.801917 336.300905 1170.513244 341.210407 1172.224571 341.210407 1173.935897 341.210407 1175.647224 341.210407 1177.358551 340.228507 1179.069878 342.192308 1180.781204 340.228507 1182.492531 341.210407 1184.203858 341.210407 1185.915184 342.192308 1187.626511 341.210407 1189.337838 334.337104 1191.049165 341.210407 1192.760491 341.210407 1194.471818 341.210407 1196.183145 336.300905 1197.894471 341.210407 1199.605798 341.210407 1201.317125 340.228507 1203.028452 341.210407 1204.739778 341.210407 1206.451105 341.210407 1208.162432 341.210407 1209.873758 341.210407 1211.585085 341.210407 1213.296412 341.210407 1215.007739 335.319005 1216.719065 341.210407 1218.430392 341.210407 1220.141719 342.192308 1221.853045 341.210407 1223.564372 335.319005 1225.275699 340.228507 1226.987025 340.228507 1228.698352 341.210407 1230.409679 341.210407 1232.121006 341.210407 1233.832332 341.210407 1235.543659 341.210407 1237.254986 340.228507 1238.966312 341.210407 1240.677639 334.337104 1242.388966 341.210407 1244.100293 340.228507 1245.811619 340.228507 1247.522946 341.210407 1249.234273 341.210407 1250.945599 334.337104 1252.656926 341.210407 1254.368253 341.210407 1256.079580 341.210407 1257.790906 341.210407 1259.502233 341.210407 1261.213560 341.210407 1262.924886 341.210407 1264.636213 341.210407 1266.347540 334.337104 1268.058867 341.210407 1269.770193 340.228507 1271.481520 340.228507 1273.192847 341.210407 1274.904173 341.210407 1276.615500 341.210407 1278.326827 336.300905 1280.038154 341.210407 1281.749480 341.210407 1283.460807 341.210407 1285.172134 341.210407 1286.883460 341.210407 1288.594787 340.228507 1290.306114 341.210407 1292.017441 335.319005 1293.728767 341.210407 1295.440094 340.228507 1297.151421 342.192308 1298.862747 341.210407 1300.574074 341.210407 1302.285401 341.210407 1303.996727 341.210407 1305.708054 335.319005 1307.419381 341.210407 1309.130708 342.192308 1310.842034 341.210407 1312.553361 341.210407 1314.264688 340.228507 1315.976014 342.192308 1317.687341 336.300905 1319.398668 340.228507 1321.109995 341.210407 1322.821321 341.210407 1324.532648 341.210407 1326.243975 341.210407 1327.955301 341.210407 1329.666628 341.210407 1331.377955 341.210407 1333.089282 336.300905 1334.800608 341.210407 1336.511935 341.210407 1338.223262 341.210407 1339.934588 341.210407 1341.645915 341.210407 1343.357242 334.337104 1345.068569 340.228507 1346.779895 340.228507 1348.491222 341.210407 1350.202549 341.210407 1351.913875 341.210407 1353.625202 340.228507 1355.336529 339.246606 1357.047856 341.210407 1358.759182 340.228507 1360.470509 335.319005 1362.181836 341.210407 1363.893162 341.210407 1365.604489 341.210407 1367.315816 340.228507 1369.027143 171.341629 1370.738469 295.061086 1372.449796 330.409502 1374.161123 336.300905 1375.872449 338.264706 1377.583776 340.228507 1379.295103 339.246606 1381.006430 341.210407 1382.717756 341.210407 1384.429083 341.210407 1386.140410 341.210407 1387.851736 336.300905 1389.563063 340.228507 1391.274390 341.210407 1392.985716 340.228507 1394.697043 341.210407 1396.408370 341.210407 1398.119697 340.228507 1399.831023 341.210407 1401.542350 341.210407 1403.253677 341.210407 1404.965003 340.228507 1406.676330 341.210407 1408.387657 341.210407 1410.098984 341.210407 1411.810310 342.192308 1413.521637 341.210407 1415.232964 335.319005 1416.944290 340.228507 1418.655617 341.210407 1420.366944 341.210407 1422.078271 340.228507 1423.789597 340.228507 1425.500924 341.210407 1427.212251 341.210407 1428.923577 341.210407 1430.634904 340.228507 1432.346231 341.210407 1434.057558 341.210407 1435.768884 340.228507 1437.480211 340.228507 1439.191538 341.210407 1440.902864 341.210407 1442.614191 336.300905 1444.325518 340.228507 1446.036845 341.210407 1447.748171 341.210407 1449.459498 341.210407 1451.170825 340.228507 1452.882151 341.210407 1454.593478 341.210407 1456.304805 340.228507 1458.016132 341.210407 1459.727458 341.210407 1461.438785 340.228507 1463.150112 341.210407 1464.861438 341.210407 1466.572765 341.210407 1468.284092 341.210407 1469.995418 336.300905 1471.706745 342.192308 1473.418072 341.210407 1475.129399 341.210407 1476.840725 341.210407 1478.552052 341.210407 1480.263379 341.210407 1481.974705 341.210407 1483.686032 341.210407 1485.397359 340.228507 1487.108686 342.192308 1488.820012 342.192308 1490.531339 341.210407 1492.242666 341.210407 1493.953992 340.228507 1495.665319 341.210407 1497.376646 335.319005 1499.087973 341.210407 1500.799299 341.210407 1502.510626 341.210407 1504.221953 341.210407 1505.933279 341.210407 1507.644606 341.210407 1509.355933 341.210407 1511.067260 342.192308 1512.778586 341.210407 1514.489913 341.210407 1516.201240 341.210407 1517.912566 341.210407 1519.623893 342.192308 1521.335220 341.210407 1523.046547 341.210407 1524.757873 336.300905 1526.469200 341.210407 1528.180527 342.192308 1529.891853 341.210407 1531.603180 341.210407 1533.314507 341.210407 1535.025834 340.228507 1536.737160 341.210407 1538.448487 341.210407 1540.159814 341.210407 1541.871140 341.210407 1543.582467 341.210407 1545.293794 283.278281 1547.005121 323.536199 1548.716447 296.042986 1550.427774 307.825792 1552.139101 335.319005 1553.850427 339.246606 1555.561754 339.246606 1557.273081 341.210407 1558.984407 340.228507 1560.695734 339.246606 1562.407061 341.210407 1564.118388 340.228507 1565.829714 341.210407 1567.541041 335.319005 1569.252368 340.228507 1570.963694 341.210407 1572.675021 341.210407 1574.386348 341.210407 1576.097675 341.210407 1577.809001 335.319005 1579.520328 341.210407 1581.231655 341.210407 1582.942981 341.210407 1584.654308 340.228507 1586.365635 340.228507 1588.076962 340.228507 1589.788288 340.228507 1591.499615 341.210407 1593.210942 336.300905 1594.922268 341.210407 1596.633595 341.210407 1598.344922 340.228507 1600.056249 341.210407 1601.767575 342.192308 1603.478902 340.228507 1605.190229 336.300905 1606.901555 341.210407 1608.612882 341.210407 1610.324209 341.210407 1612.035536 341.210407 1613.746862 341.210407 1615.458189 340.228507 1617.169516 340.228507 1618.880842 332.373303 1620.592169 340.228507 1622.303496 340.228507 1624.014823 340.228507 1625.726149 342.192308 1627.437476 341.210407 1629.148803 342.192308 1630.860129 341.210407 1632.571456 335.319005 1634.282783 340.228507 1635.994109 341.210407 1637.705436 340.228507 1639.416763 341.210407 1641.128090 341.210407 1642.839416 341.210407 1644.550743 335.319005 1646.262070 340.228507 1647.973396 341.210407 1649.684723 341.210407 1651.396050 341.210407 1653.107377 341.210407 1654.818703 340.228507 1656.530030 341.210407 1658.241357 341.210407 1659.952683 336.300905 1661.664010 340.228507 1663.375337 341.210407 1665.086664 341.210407 1666.797990 340.228507 1668.509317 341.210407 1670.220644 332.373303 1671.931970 339.246606 1673.643297 341.210407 1675.354624 341.210407 1677.065951 340.228507 1678.777277 341.210407 1680.488604 340.228507 1682.199931 340.228507 1683.911257 341.210407 1685.622584 341.210407 1687.333911 336.300905 1689.045238 340.228507 1690.756564 342.192308 1692.467891 340.228507 1694.179218 341.210407 1695.890544 336.300905 1697.601871 341.210407 1699.313198 341.210407 1701.024525 340.228507 1702.735851 341.210407 1704.447178 341.210407 1706.158505 341.210407 1707.869831 340.228507 1709.581158 341.210407 1711.292485 341.210407 1713.003812 340.228507 1714.715138 336.300905 1716.426465 342.192308 1718.137792 341.210407 1719.849118 341.210407 1721.560445 302.916290 1723.271772 340.228507 1724.983098 340.228507 1726.694425 341.210407 1728.405752 341.210407 1730.117079 341.210407 1731.828405 340.228507 1733.539732 341.210407 1735.251059 340.228507 1736.962385 340.228507 1738.673712 341.210407 1740.385039 341.210407 1742.096366 335.319005 1743.807692 340.228507" /></g><g class="series serie-1 color-1"><path class="line reactive nofill" d="M34.192308 152.685520 L35.903634 355.938914 37.614961 358.884615 39.326288 359.866516 41.037615 352.011312 42.748941 356.920814 44.460268 355.938914 46.171595 356.920814 47.882921 358.884615 49.594248 356.920814 51.305575 355.938914 53.016902 357.902715 54.728228 355.938914 56.439555 352.993213 58.150882 350.047511 59.862208 323.536199 61.573535 308.807692 63.284862 354.957014 64.996188 354.957014 66.707515 357.902715 68.418842 355.938914 70.130169 355.938914 71.841495 354.957014 73.552822 354.957014 75.264149 337.282805 76.975475 354.957014 78.686802 353.975113 80.398129 354.957014 82.109456 357.902715 83.820782 373.613122 85.532109 354.957014 87.243436 354.957014 88.954762 355.938914 90.666089 355.938914 92.377416 355.938914 94.088743 371.649321 95.800069 355.938914 97.511396 354.957014 99.222723 356.920814 100.934049 354.957014 102.645376 355.938914 104.356703 373.613122 106.068030 375.576923 107.779356 354.957014 109.490683 353.975113 111.202010 354.957014 112.913336 354.957014 114.624663 356.920814 116.335990 370.667421 118.047317 355.938914 119.758643 355.938914 121.469970 355.938914 123.181297 372.631222 124.892623 376.558824 126.603950 377.540724 128.315277 377.540724 130.026604 376.558824 131.737930 374.595023 133.449257 375.576923 135.160584 369.685520 136.871910 375.576923 138.583237 376.558824 140.294564 378.522624 142.005891 352.993213 143.717217 386.377828 145.428544 387.359729 147.139871 386.377828 148.851197 386.377828 150.562524 387.359729 152.273851 387.359729 153.985177 387.359729 155.696504 387.359729 157.407831 387.359729 159.119158 388.341629 160.830484 386.377828 162.541811 385.395928 164.253138 387.359729 165.964464 387.359729 167.675791 387.359729 169.387118 387.359729 171.098445 387.359729 172.809771 388.341629 174.521098 389.323529 176.232425 388.341629 177.943751 389.323529 179.655078 390.305430 181.366405 388.341629 183.077732 390.305430 184.789058 389.323529 186.500385 388.341629 188.211712 388.341629 189.923038 389.323529 191.634365 389.323529 193.345692 390.305430 195.057019 390.305430 196.768345 389.323529 198.479672 389.323529 200.190999 389.323529 201.902325 388.341629 203.613652 389.323529 205.324979 388.341629 207.036306 388.341629 208.747632 389.323529 210.458959 388.341629 212.170286 389.323529 213.881612 388.341629 215.592939 389.323529 217.304266 388.341629 219.015593 388.341629 220.726919 388.341629 222.438246 389.323529 224.149573 388.341629 225.860899 389.323529 227.572226 389.323529 229.283553 389.323529 230.994879 388.341629 232.706206 388.341629 234.417533 389.323529 236.128860 389.323529 237.840186 390.305430 239.551513 389.323529 241.262840 389.323529 242.974166 388.341629 244.685493 388.341629 246.396820 389.323529 248.108147 389.323529 249.819473 389.323529 251.530800 388.341629 253.242127 389.323529 254.953453 389.323529 256.664780 389.323529 258.376107 337.282805 260.087434 377.540724 261.798760 385.395928 263.510087 388.341629 265.221414 388.341629 266.932740 388.341629 268.644067 389.323529 270.355394 389.323529 272.066721 388.341629 273.778047 389.323529 275.489374 358.884615 277.200701 387.359729 278.912027 388.341629 280.623354 389.323529 282.334681 390.305430 284.046008 390.305430 285.757334 388.341629 287.468661 389.323529 289.179988 386.377828 290.891314 389.323529 292.602641 389.323529 294.313968 389.323529 296.025295 389.323529 297.736621 389.323529 299.447948 388.341629 301.159275 388.341629 302.870601 388.341629 304.581928 388.341629 306.293255 388.341629 308.004582 390.305430 309.715908 388.341629 311.427235 389.323529 313.138562 388.341629 314.849888 389.323529 316.561215 388.341629 318.272542 389.323529 319.983868 389.323529 321.695195 388.341629 323.406522 388.341629 325.117849 389.323529 326.829175 389.323529 328.540502 309.789593 330.251829 356.920814 331.963155 359.866516 333.674482 351.029412 335.385809 365.757919 337.097136 361.830317 338.808462 354.957014 340.519789 347.101810 342.231116 384.414027 343.942442 387.359729 345.653769 389.323529 347.365096 389.323529 349.076423 389.323529 350.787749 388.341629 352.499076 388.341629 354.210403 389.323529 355.921729 387.359729 357.633056 389.323529 359.344383 388.341629 361.055710 389.323529 362.767036 389.323529 364.478363 389.323529 366.189690 389.323529 367.901016 389.323529 369.612343 388.341629 371.323670 389.323529 373.034997 388.341629 374.746323 389.323529 376.457650 389.323529 378.168977 388.341629 379.880303 381.468326 381.591630 389.323529 383.302957 389.323529 385.014284 389.323529 386.725610 389.323529 388.436937 389.323529 390.148264 389.323529 391.859590 389.323529 393.570917 389.323529 395.282244 389.323529 396.993570 389.323529 398.704897 389.323529 400.416224 389.323529 402.127551 389.323529 403.838877 389.323529 405.550204 381.468326 407.261531 389.323529 408.972857 388.341629 410.684184 388.341629 412.395511 389.323529 414.106838 389.323529 415.818164 389.323529 417.529491 388.341629 419.240818 389.323529 420.952144 388.341629 422.663471 389.323529 424.374798 389.323529 426.086125 388.341629 427.797451 390.305430 429.508778 389.323529 431.220105 389.323529 432.931431 389.323529 434.642758 388.341629 436.354085 389.323529 438.065412 389.323529 439.776738 389.323529 441.488065 389.323529 443.199392 389.323529 444.910718 387.359729 446.622045 389.323529 448.333372 389.323529 450.044699 389.323529 451.756025 389.323529 453.467352 389.323529 455.178679 389.323529 456.890005 388.341629 458.601332 389.323529 460.312659 388.341629 462.023986 389.323529 463.735312 389.323529 465.446639 389.323529 467.157966 389.323529 468.869292 389.323529 470.580619 389.323529 472.291946 389.323529 474.003273 388.341629 475.714599 389.323529 477.425926 388.341629 479.137253 388.341629 480.848579 390.305430 482.559906 388.341629 484.271233 389.323529 485.982559 388.341629 487.693886 388.341629 489.405213 389.323529 491.116540 389.323529 492.827866 389.323529 494.539193 388.341629 496.250520 387.359729 497.961846 388.341629 499.673173 388.341629 501.384500 389.323529 503.095827 389.323529 504.807153 379.504525 506.518480 381.468326 508.229807 385.395928 509.941133 386.377828 511.652460 386.377828 513.363787 384.414027 515.075114 380.486425 516.786440 379.504525 518.497767 386.377828 520.209094 377.540724 521.920420 377.540724 523.631747 382.450226 525.343074 369.685520 527.054401 377.540724 528.765727 385.395928 530.477054 388.341629 532.188381 388.341629 533.899707 388.341629 535.611034 388.341629 537.322361 389.323529 539.033688 388.341629 540.745014 389.323529 542.456341 388.341629 544.167668 388.341629 545.878994 389.323529 547.590321 388.341629 549.301648 389.323529 551.012975 389.323529 552.724301 389.323529 554.435628 389.323529 556.146955 389.323529 557.858281 388.341629 559.569608 389.323529 561.280935 389.323529 562.992261 389.323529 564.703588 388.341629 566.414915 389.323529 568.126242 389.323529 569.837568 389.323529 571.548895 386.377828 573.260222 388.341629 574.971548 388.341629 576.682875 389.323529 578.394202 389.323529 580.105529 389.323529 581.816855 389.323529 583.528182 388.341629 585.239509 389.323529 586.950835 388.341629 588.662162 388.341629 590.373489 389.323529 592.084816 388.341629 593.796142 389.323529 595.507469 389.323529 597.218796 389.323529 598.930122 343.174208 600.641449 377.540724 602.352776 385.395928 604.064103 390.305430 605.775429 388.341629 607.486756 388.341629 609.198083 388.341629 610.909409 388.341629 612.620736 388.341629 614.332063 388.341629 616.043390 389.323529 617.754716 388.341629 619.466043 389.323529 621.177370 389.323529 622.888696 387.359729 624.600023 388.341629 626.311350 389.323529 628.022677 389.323529 629.734003 389.323529 631.445330 389.323529 633.156657 389.323529 634.867983 389.323529 636.579310 389.323529 638.290637 389.323529 640.001964 389.323529 641.713290 388.341629 643.424617 389.323529 645.135944 389.323529 646.847270 390.305430 648.558597 388.341629 650.269924 389.323529 651.981250 389.323529 653.692577 389.323529 655.403904 389.323529 657.115231 389.323529 658.826557 389.323529 660.537884 388.341629 662.249211 389.323529 663.960537 389.323529 665.671864 389.323529 667.383191 389.323529 669.094518 389.323529 670.805844 389.323529 672.517171 390.305430 674.228498 388.341629 675.939824 389.323529 677.651151 389.323529 679.362478 389.323529 681.073805 389.323529 682.785131 389.323529 684.496458 389.323529 686.207785 388.341629 687.919111 389.323529 689.630438 388.341629 691.341765 389.323529 693.053092 389.323529 694.764418 389.323529 696.475745 389.323529 698.187072 389.323529 699.898398 388.341629 701.609725 389.323529 703.321052 390.305430 705.032379 390.305430 706.743705 389.323529 708.455032 389.323529 710.166359 389.323529 711.877685 389.323529 713.589012 390.305430 715.300339 390.305430 717.011666 389.323529 718.722992 389.323529 720.434319 389.323529 722.145646 292.115385 723.856972 356.920814 725.568299 367.721719 727.279626 366.739819 728.990952 361.830317 730.702279 363.794118 732.413606 364.776018 734.124933 361.830317 735.836259 380.486425 737.547586 359.866516 739.258913 387.359729 740.970239 348.083710 742.681566 388.341629 744.392893 386.377828 746.104220 388.341629 747.815546 364.776018 749.526873 383.432127 751.238200 381.468326 752.949526 381.468326 754.660853 381.468326 756.372180 381.468326 758.083507 381.468326 759.794833 384.414027 761.506160 387.359729 763.217487 378.522624 764.928813 388.341629 766.640140 388.341629 768.351467 389.323529 770.062794 389.323529 771.774120 389.323529 773.485447 389.323529 775.196774 388.341629 776.908100 389.323529 778.619427 389.323529 780.330754 390.305430 782.042081 389.323529 783.753407 389.323529 785.464734 388.341629 787.176061 388.341629 788.887387 389.323529 790.598714 389.323529 792.310041 389.323529 794.021368 389.323529 795.732694 389.323529 797.444021 389.323529 799.155348 389.323529 800.866674 389.323529 802.578001 389.323529 804.289328 388.341629 806.000655 389.323529 807.711981 389.323529 809.423308 389.323529 811.134635 389.323529 812.845961 389.323529 814.557288 388.341629 816.268615 389.323529 817.979941 389.323529 819.691268 389.323529 821.402595 389.323529 823.113922 389.323529 824.825248 389.323529 826.536575 388.341629 828.247902 389.323529 829.959228 389.323529 831.670555 388.341629 833.381882 389.323529 835.093209 390.305430 836.804535 389.323529 838.515862 389.323529 840.227189 389.323529 841.938515 389.323529 843.649842 389.323529 845.361169 389.323529 847.072496 389.323529 848.783822 389.323529 850.495149 389.323529 852.206476 389.323529 853.917802 389.323529 855.629129 389.323529 857.340456 388.341629 859.051783 389.323529 860.763109 389.323529 862.474436 390.305430 864.185763 389.323529 865.897089 389.323529 867.608416 389.323529 869.319743 389.323529 871.031070 389.323529 872.742396 389.323529 874.453723 389.323529 876.165050 338.264706 877.876376 389.323529 879.587703 389.323529 881.299030 389.323529 883.010357 389.323529 884.721683 389.323529 886.433010 389.323529 888.144337 389.323529 889.855663 389.323529 891.566990 389.323529 893.278317 389.323529 894.989643 389.323529 896.700970 390.305430 898.412297 389.323529 900.123624 388.341629 901.834950 389.323529 903.546277 389.323529 905.257604 389.323529 906.968930 388.341629 908.680257 389.323529 910.391584 390.305430 912.102911 389.323529 913.814237 389.323529 915.525564 389.323529 917.236891 389.323529 918.948217 390.305430 920.659544 389.323529 922.370871 389.323529 924.082198 389.323529 925.793524 388.341629 927.504851 389.323529 929.216178 389.323529 930.927504 389.323529 932.638831 389.323529 934.350158 389.323529 936.061485 388.341629 937.772811 390.305430 939.484138 390.305430 941.195465 388.341629 942.906791 389.323529 944.618118 389.323529 946.329445 389.323529 948.040772 382.450226 949.752098 390.305430 951.463425 389.323529 953.174752 389.323529 954.886078 389.323529 956.597405 390.305430 958.308732 388.341629 960.020059 389.323529 961.731385 389.323529 963.442712 389.323529 965.154039 389.323529 966.865365 352.011312 968.576692 376.558824 970.288019 382.450226 971.999345 388.341629 973.710672 388.341629 975.421999 389.323529 977.133326 389.323529 978.844652 388.341629 980.555979 389.323529 982.267306 389.323529 983.978632 388.341629 985.689959 390.305430 987.401286 389.323529 989.112613 389.323529 990.823939 389.323529 992.535266 389.323529 994.246593 388.341629 995.957919 389.323529 997.669246 389.323529 999.380573 389.323529 1001.091900 389.323529 1002.803226 389.323529 1004.514553 389.323529 1006.225880 389.323529 1007.937206 389.323529 1009.648533 388.341629 1011.359860 389.323529 1013.071187 389.323529 1014.782513 389.323529 1016.493840 389.323529 1018.205167 389.323529 1019.916493 380.486425 1021.627820 389.323529 1023.339147 389.323529 1025.050474 389.323529 1026.761800 389.323529 1028.473127 389.323529 1030.184454 389.323529 1031.895780 388.341629 1033.607107 389.323529 1035.318434 388.341629 1037.029761 389.323529 1038.741087 389.323529 1040.452414 389.323529 1042.163741 389.323529 1043.875067 390.305430 1045.586394 389.323529 1047.297721 389.323529 1049.009048 390.305430 1050.720374 389.323529 1052.431701 389.323529 1054.143028 390.305430 1055.854354 389.323529 1057.565681 389.323529 1059.277008 388.341629 1060.988334 390.305430 1062.699661 389.323529 1064.410988 389.323529 1066.122315 389.323529 1067.833641 389.323529 1069.544968 389.323529 1071.256295 389.323529 1072.967621 390.305430 1074.678948 389.323529 1076.390275 389.323529 1078.101602 389.323529 1079.812928 389.323529 1081.524255 390.305430 1083.235582 389.323529 1084.946908 388.341629 1086.658235 389.323529 1088.369562 389.323529 1090.080889 388.341629 1091.792215 382.450226 1093.503542 388.341629 1095.214869 389.323529 1096.926195 389.323529 1098.637522 389.323529 1100.348849 389.323529 1102.060176 389.323529 1103.771502 389.323529 1105.482829 388.341629 1107.194156 389.323529 1108.905482 389.323529 1110.616809 389.323529 1112.328136 389.323529 1114.039463 389.323529 1115.750789 389.323529 1117.462116 389.323529 1119.173443 389.323529 1120.884769 389.323529 1122.596096 389.323529 1124.307423 388.341629 1126.018750 388.341629 1127.730076 389.323529 1129.441403 262.658371 1131.152730 364.776018 1132.864056 364.776018 1134.575383 378.522624 1136.286710 382.450226 1137.998036 387.359729 1139.709363 387.359729 1141.420690 388.341629 1143.132017 388.341629 1144.843343 389.323529 1146.554670 389.323529 1148.265997 389.323529 1149.977323 389.323529 1151.688650 389.323529 1153.399977 388.341629 1155.111304 389.323529 1156.822630 389.323529 1158.533957 389.323529 1160.245284 389.323529 1161.956610 390.305430 1163.667937 379.504525 1165.379264 388.341629 1167.090591 389.323529 1168.801917 389.323529 1170.513244 389.323529 1172.224571 389.323529 1173.935897 389.323529 1175.647224 389.323529 1177.358551 390.305430 1179.069878 390.305430 1180.781204 389.323529 1182.492531 389.323529 1184.203858 389.323529 1185.915184 388.341629 1187.626511 389.323529 1189.337838 389.323529 1191.049165 389.323529 1192.760491 389.323529 1194.471818 389.323529 1196.183145 390.305430 1197.894471 389.323529 1199.605798 389.323529 1201.317125 389.323529 1203.028452 389.323529 1204.739778 390.305430 1206.451105 389.323529 1208.162432 389.323529 1209.873758 389.323529 1211.585085 389.323529 1213.296412 389.323529 1215.007739 389.323529 1216.719065 389.323529 1218.430392 388.341629 1220.141719 389.323529 1221.853045 389.323529 1223.564372 389.323529 1225.275699 389.323529 1226.987025 389.323529 1228.698352 389.323529 1230.409679 389.323529 1232.121006 389.323529 1233.832332 389.323529 1235.543659 382.450226 1237.254986 389.323529 1238.966312 389.323529 1240.677639 389.323529 1242.388966 388.341629 1244.100293 390.305430 1245.811619 389.323529 1247.522946 389.323529 1249.234273 389.323529 1250.945599 389.323529 1252.656926 389.323529 1254.368253 389.323529 1256.079580 389.323529 1257.790906 389.323529 1259.502233 390.305430 1261.213560 389.323529 1262.924886 389.323529 1264.636213 389.323529 1266.347540 389.323529 1268.058867 389.323529 1269.770193 389.323529 1271.481520 389.323529 1273.192847 389.323529 1274.904173 389.323529 1276.615500 389.323529 1278.326827 389.323529 1280.038154 389.323529 1281.749480 389.323529 1283.460807 389.323529 1285.172134 390.305430 1286.883460 389.323529 1288.594787 389.323529 1290.306114 389.323529 1292.017441 389.323529 1293.728767 389.323529 1295.440094 389.323529 1297.151421 389.323529 1298.862747 390.305430 1300.574074 389.323529 1302.285401 389.323529 1303.996727 389.323529 1305.708054 389.323529 1307.419381 383.432127 1309.130708 389.323529 1310.842034 389.323529 1312.553361 389.323529 1314.264688 389.323529 1315.976014 389.323529 1317.687341 389.323529 1319.398668 388.341629 1321.109995 389.323529 1322.821321 389.323529 1324.532648 389.323529 1326.243975 390.305430 1327.955301 389.323529 1329.666628 389.323529 1331.377955 389.323529 1333.089282 389.323529 1334.800608 389.323529 1336.511935 389.323529 1338.223262 389.323529 1339.934588 389.323529 1341.645915 389.323529 1343.357242 388.341629 1345.068569 388.341629 1346.779895 389.323529 1348.491222 389.323529 1350.202549 389.323529 1351.913875 389.323529 1353.625202 389.323529 1355.336529 387.359729 1357.047856 388.341629 1358.759182 389.323529 1360.470509 388.341629 1362.181836 389.323529 1363.893162 389.323529 1365.604489 390.305430 1367.315816 389.323529 1369.027143 389.323529 1370.738469 349.065611 1372.449796 385.395928 1374.161123 388.341629 1375.872449 388.341629 1377.583776 388.341629 1379.295103 380.486425 1381.006430 388.341629 1382.717756 390.305430 1384.429083 389.323529 1386.140410 389.323529 1387.851736 389.323529 1389.563063 389.323529 1391.274390 389.323529 1392.985716 389.323529 1394.697043 388.341629 1396.408370 389.323529 1398.119697 389.323529 1399.831023 390.305430 1401.542350 389.323529 1403.253677 389.323529 1404.965003 389.323529 1406.676330 389.323529 1408.387657 389.323529 1410.098984 390.305430 1411.810310 390.305430 1413.521637 390.305430 1415.232964 389.323529 1416.944290 390.305430 1418.655617 390.305430 1420.366944 389.323529 1422.078271 389.323529 1423.789597 389.323529 1425.500924 389.323529 1427.212251 389.323529 1428.923577 389.323529 1430.634904 389.323529 1432.346231 388.341629 1434.057558 389.323529 1435.768884 389.323529 1437.480211 389.323529 1439.191538 390.305430 1440.902864 389.323529 1442.614191 389.323529 1444.325518 388.341629 1446.036845 389.323529 1447.748171 389.323529 1449.459498 389.323529 1451.170825 383.432127 1452.882151 389.323529 1454.593478 388.341629 1456.304805 389.323529 1458.016132 389.323529 1459.727458 389.323529 1461.438785 389.323529 1463.150112 389.323529 1464.861438 389.323529 1466.572765 389.323529 1468.284092 389.323529 1469.995418 389.323529 1471.706745 389.323529 1473.418072 388.341629 1475.129399 389.323529 1476.840725 389.323529 1478.552052 389.323529 1480.263379 389.323529 1481.974705 388.341629 1483.686032 389.323529 1485.397359 389.323529 1487.108686 390.305430 1488.820012 389.323529 1490.531339 389.323529 1492.242666 389.323529 1493.953992 389.323529 1495.665319 388.341629 1497.376646 389.323529 1499.087973 389.323529 1500.799299 389.323529 1502.510626 389.323529 1504.221953 389.323529 1505.933279 389.323529 1507.644606 390.305430 1509.355933 389.323529 1511.067260 389.323529 1512.778586 390.305430 1514.489913 389.323529 1516.201240 390.305430 1517.912566 390.305430 1519.623893 389.323529 1521.335220 383.432127 1523.046547 383.432127 1524.757873 389.323529 1526.469200 389.323529 1528.180527 389.323529 1529.891853 390.305430 1531.603180 388.341629 1533.314507 389.323529 1535.025834 389.323529 1536.737160 389.323529 1538.448487 389.323529 1540.159814 389.323529 1541.871140 389.323529 1543.582467 389.323529 1545.293794 389.323529 1547.005121 347.101810 1548.716447 362.812217 1550.427774 356.920814 1552.139101 386.377828 1553.850427 387.359729 1555.561754 389.323529 1557.273081 388.341629 1558.984407 389.323529 1560.695734 388.341629 1562.407061 389.323529 1564.118388 389.323529 1565.829714 389.323529 1567.541041 390.305430 1569.252368 389.323529 1570.963694 389.323529 1572.675021 389.323529 1574.386348 389.323529 1576.097675 389.323529 1577.809001 389.323529 1579.520328 388.341629 1581.231655 388.341629 1582.942981 388.341629 1584.654308 389.323529 1586.365635 389.323529 1588.076962 388.341629 1589.788288 388.341629 1591.499615 388.341629 1593.210942 389.323529 1594.922268 380.486425 1596.633595 389.323529 1598.344922 389.323529 1600.056249 388.341629 1601.767575 389.323529 1603.478902 389.323529 1605.190229 388.341629 1606.901555 388.341629 1608.612882 389.323529 1610.324209 389.323529 1612.035536 389.323529 1613.746862 389.323529 1615.458189 389.323529 1617.169516 389.323529 1618.880842 389.323529 1620.592169 388.341629 1622.303496 388.341629 1624.014823 389.323529 1625.726149 388.341629 1627.437476 389.323529 1629.148803 389.323529 1630.860129 389.323529 1632.571456 389.323529 1634.282783 389.323529 1635.994109 388.341629 1637.705436 388.341629 1639.416763 389.323529 1641.128090 389.323529 1642.839416 389.323529 1644.550743 389.323529 1646.262070 389.323529 1647.973396 389.323529 1649.684723 389.323529 1651.396050 389.323529 1653.107377 389.323529 1654.818703 389.323529 1656.530030 389.323529 1658.241357 389.323529 1659.952683 389.323529 1661.664010 389.323529 1663.375337 389.323529 1665.086664 389.323529 1666.797990 383.432127 1668.509317 388.341629 1670.220644 389.323529 1671.931970 388.341629 1673.643297 389.323529 1675.354624 389.323529 1677.065951 389.323529 1678.777277 389.323529 1680.488604 389.323529 1682.199931 389.323529 1683.911257 389.323529 1685.622584 389.323529 1687.333911 389.323529 1689.045238 390.305430 1690.756564 389.323529 1692.467891 389.323529 1694.179218 389.323529 1695.890544 388.341629 1697.601871 389.323529 1699.313198 389.323529 1701.024525 389.323529 1702.735851 389.323529 1704.447178 389.323529 1706.158505 389.323529 1707.869831 389.323529 1709.581158 389.323529 1711.292485 389.323529 1713.003812 389.323529 1714.715138 389.323529 1716.426465 389.323529 1718.137792 388.341629 1719.849118 389.323529 1721.560445 389.323529 1723.271772 388.341629 1724.983098 389.323529 1726.694425 389.323529 1728.405752 389.323529 1730.117079 387.359729 1731.828405 389.323529 1733.539732 390.305430 1735.251059 389.323529 1736.962385 389.323529 1738.673712 383.432127 1740.385039 390.305430 1742.096366 389.323529 1743.807692 389.323529" /></g><g class="series serie-2 color-2"><path class="line reactive nofill" d="M34.192308 425.653846 L35.903634 55.476951 37.614961 74.132823 39.326288 74.132823 41.037615 54.494743 42.748941 72.170432 44.460268 64.314795 46.171595 81.988460 47.882921 73.150615 49.594248 70.206017 51.305575 63.332588 53.016902 86.897473 54.728228 83.952875 56.439555 175.269846 58.150882 130.102464 59.862208 184.105665 61.573535 62.350380 63.284862 87.879681 64.996188 89.844097 66.707515 194.907926 68.418842 100.644332 70.130169 91.808512 71.841495 93.770903 73.552822 91.808512 75.264149 90.826305 76.975475 85.917291 78.686802 73.150615 80.398129 76.097238 82.109456 92.788695 83.820782 234.184086 85.532109 122.246827 87.243436 128.138049 88.954762 135.993686 90.666089 125.191426 92.377416 127.155841 94.088743 226.328449 95.800069 124.211243 97.511396 135.011478 99.222723 129.120257 100.934049 125.191426 102.645376 134.029270 104.356703 238.110892 106.068030 229.273047 107.779356 125.191426 109.490683 128.138049 111.202010 117.337814 112.913336 130.102464 114.624663 129.120257 116.335990 210.617175 118.047317 127.155841 119.758643 138.938284 121.469970 140.902700 123.181297 198.834732 124.892623 205.708161 126.603950 249.893334 128.315277 244.984321 130.026604 181.161067 131.737930 250.875542 133.449257 244.984321 135.160584 92.788695 136.871910 250.875542 138.583237 223.381825 140.294564 300.951937 142.005891 261.675777 143.717217 258.731179 145.428544 266.586816 147.139871 253.822166 148.851197 264.622401 150.562524 262.657985 152.273851 264.622401 153.985177 275.422636 155.696504 264.622401 157.407831 326.481239 159.119158 322.554433 160.830484 307.825367 162.541811 269.531414 164.253138 264.622401 165.964464 275.422636 167.675791 264.622401 169.387118 270.513622 171.098445 264.622401 172.809771 276.404844 174.521098 329.427862 176.232425 330.410070 177.943751 328.445654 179.655078 330.410070 181.366405 329.427862 183.077732 330.410070 184.789058 329.427862 186.500385 326.481239 188.211712 324.518848 189.923038 330.410070 191.634365 329.427862 193.345692 330.410070 195.057019 330.410070 196.768345 330.410070 198.479672 329.427862 200.190999 329.427862 201.902325 329.427862 203.613652 329.427862 205.324979 328.445654 207.036306 329.427862 208.747632 329.427862 210.458959 328.445654 212.170286 328.445654 213.881612 329.427862 215.592939 323.536641 217.304266 326.481239 219.015593 328.445654 220.726919 329.427862 222.438246 329.427862 224.149573 328.445654 225.860899 329.427862 227.572226 329.427862 229.283553 329.427862 230.994879 329.427862 232.706206 329.427862 234.417533 329.427862 236.128860 329.427862 237.840186 329.427862 239.551513 330.410070 241.262840 330.410070 242.974166 324.518848 244.685493 329.427862 246.396820 328.445654 248.108147 330.410070 249.819473 328.445654 251.530800 325.499031 253.242127 329.427862 254.953453 330.410070 256.664780 330.410070 258.376107 81.006252 260.087434 252.839958 261.798760 290.151702 263.510087 300.951937 265.221414 299.969730 266.932740 299.969730 268.644067 301.934145 270.355394 294.078508 272.066721 301.934145 273.778047 301.934145 275.489374 246.948736 277.200701 299.969730 278.912027 308.807574 280.623354 307.825367 282.334681 247.928919 284.046008 244.984321 285.757334 326.481239 287.468661 328.445654 289.179988 318.627627 290.891314 328.445654 292.602641 328.445654 294.313968 329.427862 296.025295 327.463446 297.736621 324.518848 299.447948 310.771990 301.159275 324.518848 302.870601 326.481239 304.581928 327.463446 306.293255 327.463446 308.004582 329.427862 309.715908 327.463446 311.427235 330.410070 313.138562 328.445654 314.849888 319.607809 316.561215 328.445654 318.272542 327.463446 319.983868 327.463446 321.695195 329.427862 323.406522 328.445654 325.117849 324.518848 326.829175 213.563798 328.540502 188.034496 330.251829 254.802348 331.963155 261.675777 333.674482 265.604608 335.385809 277.387051 337.097136 273.460245 338.808462 242.037697 340.519789 231.237462 342.231116 314.698796 343.942442 324.518848 345.653769 327.463446 347.365096 329.427862 349.076423 327.463446 350.787749 322.554433 352.499076 327.463446 354.210403 320.590017 355.921729 326.481239 357.633056 327.463446 359.344383 328.445654 361.055710 329.427862 362.767036 329.427862 364.478363 328.445654 366.189690 328.445654 367.901016 329.427862 369.612343 329.427862 371.323670 328.445654 373.034997 327.463446 374.746323 327.463446 376.457650 329.427862 378.168977 323.536641 379.880303 315.681004 381.591630 328.445654 383.302957 329.427862 385.014284 328.445654 386.725610 328.445654 388.436937 329.427862 390.148264 328.445654 391.859590 329.427862 393.570917 329.427862 395.282244 328.445654 396.993570 328.445654 398.704897 327.463446 400.416224 329.427862 402.127551 329.427862 403.838877 328.445654 405.550204 316.663211 407.261531 329.427862 408.972857 329.427862 410.684184 327.463446 412.395511 328.445654 414.106838 329.427862 415.818164 328.445654 417.529491 329.427862 419.240818 328.445654 420.952144 328.445654 422.663471 328.445654 424.374798 328.445654 426.086125 329.427862 427.797451 328.445654 429.508778 329.427862 431.220105 320.590017 432.931431 323.536641 434.642758 288.187287 436.354085 327.463446 438.065412 327.463446 439.776738 329.427862 441.488065 328.445654 443.199392 328.445654 444.910718 328.445654 446.622045 328.445654 448.333372 327.463446 450.044699 329.427862 451.756025 329.427862 453.467352 328.445654 455.178679 327.463446 456.890005 327.463446 458.601332 327.463446 460.312659 323.536641 462.023986 327.463446 463.735312 328.445654 465.446639 327.463446 467.157966 327.463446 468.869292 328.445654 470.580619 329.427862 472.291946 329.427862 474.003273 327.463446 475.714599 327.463446 477.425926 325.499031 479.137253 327.463446 480.848579 323.536641 482.559906 325.499031 484.271233 328.445654 485.982559 327.463446 487.693886 324.518848 489.405213 329.427862 491.116540 327.463446 492.827866 329.427862 494.539193 329.427862 496.250520 319.607809 497.961846 327.463446 499.673173 328.445654 501.384500 329.427862 503.095827 327.463446 504.807153 71.188225 506.518480 289.169494 508.229807 318.627627 509.941133 318.627627 511.652460 309.789782 513.363787 305.862976 515.075114 296.042924 516.786440 302.916353 518.497767 311.754198 520.209094 298.007339 521.920420 292.116118 523.631747 300.951937 525.343074 283.278273 527.054401 298.007339 528.765727 312.734380 530.477054 325.499031 532.188381 324.518848 533.899707 189.996887 535.611034 325.499031 537.322361 328.445654 539.033688 327.463446 540.745014 328.445654 542.456341 320.590017 544.167668 328.445654 545.878994 321.572225 547.590321 328.445654 549.301648 329.427862 551.012975 329.427862 552.724301 329.427862 554.435628 328.445654 556.146955 329.427862 557.858281 328.445654 559.569608 328.445654 561.280935 328.445654 562.992261 329.427862 564.703588 316.663211 566.414915 326.481239 568.126242 327.463446 569.837568 323.536641 571.548895 326.481239 573.260222 328.445654 574.971548 328.445654 576.682875 328.445654 578.394202 329.427862 580.105529 330.410070 581.816855 328.445654 583.528182 328.445654 585.239509 329.427862 586.950835 330.410070 588.662162 328.445654 590.373489 328.445654 592.084816 329.427862 593.796142 328.445654 595.507469 329.427862 597.218796 269.531414 598.930122 184.105665 600.641449 274.440428 602.352776 317.645419 604.064103 302.916353 605.775429 323.536641 607.486756 328.445654 609.198083 327.463446 610.909409 327.463446 612.620736 329.427862 614.332063 328.445654 616.043390 330.410070 617.754716 329.427862 619.466043 329.427862 621.177370 330.410070 622.888696 291.133910 624.600023 324.518848 626.311350 329.427862 628.022677 330.410070 629.734003 330.410070 631.445330 329.427862 633.156657 329.427862 634.867983 328.445654 636.579310 330.410070 638.290637 329.427862 640.001964 330.410070 641.713290 308.807574 643.424617 329.427862 645.135944 329.427862 646.847270 331.392278 648.558597 320.590017 650.269924 323.536641 651.981250 329.427862 653.692577 329.427862 655.403904 330.410070 657.115231 329.427862 658.826557 329.427862 660.537884 329.427862 662.249211 328.445654 663.960537 330.410070 665.671864 328.445654 667.383191 328.445654 669.094518 330.410070 670.805844 330.410070 672.517171 329.427862 674.228498 321.572225 675.939824 327.463446 677.651151 324.518848 679.362478 329.427862 681.073805 330.410070 682.785131 330.410070 684.496458 329.427862 686.207785 329.427862 687.919111 330.410070 689.630438 328.445654 691.341765 330.410070 693.053092 330.410070 694.764418 329.427862 696.475745 329.427862 698.187072 330.410070 699.898398 323.536641 701.609725 329.427862 703.321052 328.445654 705.032379 325.499031 706.743705 330.410070 708.455032 330.410070 710.166359 328.445654 711.877685 330.410070 713.589012 330.410070 715.300339 330.410070 717.011666 330.410070 718.722992 328.445654 720.434319 329.427862 722.145646 236.146476 723.856972 245.966529 725.568299 283.278273 727.279626 287.205079 728.990952 265.604608 730.702279 279.351467 732.413606 277.387051 734.124933 274.440428 735.836259 268.549207 737.547586 238.110892 739.258913 320.590017 740.970239 284.260481 742.681566 323.536641 744.392893 321.572225 746.104220 324.518848 747.815546 300.951937 749.526873 314.698796 751.238200 306.843159 752.949526 306.843159 754.660853 300.951937 756.372180 305.862976 758.083507 294.078508 759.794833 300.951937 761.506160 325.499031 763.217487 121.264620 764.928813 321.572225 766.640140 329.427862 768.351467 330.410070 770.062794 328.445654 771.774120 329.427862 773.485447 329.427862 775.196774 329.427862 776.908100 330.410070 778.619427 329.427862 780.330754 330.410070 782.042081 329.427862 783.753407 330.410070 785.464734 319.607809 787.176061 329.427862 788.887387 330.410070 790.598714 330.410070 792.310041 329.427862 794.021368 329.427862 795.732694 329.427862 797.444021 330.410070 799.155348 330.410070 800.866674 330.410070 802.578001 330.410070 804.289328 328.445654 806.000655 329.427862 807.711981 330.410070 809.423308 330.410070 811.134635 330.410070 812.845961 324.518848 814.557288 330.410070 816.268615 329.427862 817.979941 330.410070 819.691268 330.410070 821.402595 330.410070 823.113922 329.427862 824.825248 330.410070 826.536575 317.645419 828.247902 329.427862 829.959228 329.427862 831.670555 330.410070 833.381882 329.427862 835.093209 331.392278 836.804535 330.410070 838.515862 329.427862 840.227189 324.518848 841.938515 328.445654 843.649842 329.427862 845.361169 329.427862 847.072496 329.427862 848.783822 329.427862 850.495149 330.410070 852.206476 330.410070 853.917802 330.410070 855.629129 331.392278 857.340456 330.410070 859.051783 330.410070 860.763109 330.410070 862.474436 331.392278 864.185763 329.427862 865.897089 330.410070 867.608416 324.518848 869.319743 329.427862 871.031070 329.427862 872.742396 330.410070 874.453723 329.427862 876.165050 279.351467 877.876376 330.410070 879.587703 329.427862 881.299030 330.410070 883.010357 329.427862 884.721683 330.410070 886.433010 330.410070 888.144337 327.463446 889.855663 328.445654 891.566990 330.410070 893.278317 330.410070 894.989643 326.481239 896.700970 330.410070 898.412297 331.392278 900.123624 328.445654 901.834950 330.410070 903.546277 330.410070 905.257604 329.427862 906.968930 330.410070 908.680257 330.410070 910.391584 329.427862 912.102911 330.410070 913.814237 329.427862 915.525564 330.410070 917.236891 328.445654 918.948217 330.410070 920.659544 329.427862 922.370871 325.499031 924.082198 329.427862 925.793524 328.445654 927.504851 330.410070 929.216178 329.427862 930.927504 330.410070 932.638831 329.427862 934.350158 329.427862 936.061485 322.554433 937.772811 330.410070 939.484138 330.410070 941.195465 329.427862 942.906791 330.410070 944.618118 330.410070 946.329445 329.427862 948.040772 323.536641 949.752098 325.499031 951.463425 330.410070 953.174752 328.445654 954.886078 331.392278 956.597405 330.410070 958.308732 330.410070 960.020059 330.410070 961.731385 330.410070 963.442712 329.427862 965.154039 330.410070 966.865365 183.123458 968.576692 265.604608 970.288019 307.825367 971.999345 324.518848 973.710672 327.463446 975.421999 330.410070 977.133326 323.536641 978.844652 328.445654 980.555979 330.410070 982.267306 328.445654 983.978632 329.427862 985.689959 329.427862 987.401286 329.427862 989.112613 330.410070 990.823939 329.427862 992.535266 329.427862 994.246593 328.445654 995.957919 330.410070 997.669246 328.445654 999.380573 330.410070 1001.091900 328.445654 1002.803226 330.410070 1004.514553 324.518848 1006.225880 330.410070 1007.937206 329.427862 1009.648533 328.445654 1011.359860 329.427862 1013.071187 330.410070 1014.782513 329.427862 1016.493840 328.445654 1018.205167 328.445654 1019.916493 321.572225 1021.627820 329.427862 1023.339147 329.427862 1025.050474 328.445654 1026.761800 329.427862 1028.473127 329.427862 1030.184454 329.427862 1031.895780 323.536641 1033.607107 330.410070 1035.318434 330.410070 1037.029761 329.427862 1038.741087 329.427862 1040.452414 329.427862 1042.163741 329.427862 1043.875067 329.427862 1045.586394 329.427862 1047.297721 330.410070 1049.009048 329.427862 1050.720374 330.410070 1052.431701 329.427862 1054.143028 329.427862 1055.854354 329.427862 1057.565681 328.445654 1059.277008 317.645419 1060.988334 330.410070 1062.699661 329.427862 1064.410988 329.427862 1066.122315 330.410070 1067.833641 329.427862 1069.544968 329.427862 1071.256295 330.410070 1072.967621 328.445654 1074.678948 329.427862 1076.390275 329.427862 1078.101602 330.410070 1079.812928 330.410070 1081.524255 330.410070 1083.235582 330.410070 1084.946908 328.445654 1086.658235 323.536641 1088.369562 330.410070 1090.080889 330.410070 1091.792215 322.554433 1093.503542 327.463446 1095.214869 328.445654 1096.926195 330.410070 1098.637522 329.427862 1100.348849 328.445654 1102.060176 329.427862 1103.771502 330.410070 1105.482829 329.427862 1107.194156 329.427862 1108.905482 330.410070 1110.616809 329.427862 1112.328136 329.427862 1114.039463 323.536641 1115.750789 329.427862 1117.462116 330.410070 1119.173443 329.427862 1120.884769 329.427862 1122.596096 329.427862 1124.307423 329.427862 1126.018750 328.445654 1127.730076 329.427862 1129.441403 205.708161 1131.152730 268.549207 1132.864056 258.731179 1134.575383 265.604608 1136.286710 305.862976 1137.998036 324.518848 1139.709363 325.499031 1141.420690 322.554433 1143.132017 329.427862 1144.843343 329.427862 1146.554670 330.410070 1148.265997 329.427862 1149.977323 328.445654 1151.688650 329.427862 1153.399977 329.427862 1155.111304 330.410070 1156.822630 329.427862 1158.533957 329.427862 1160.245284 330.410070 1161.956610 329.427862 1163.667937 312.734380 1165.379264 327.463446 1167.090591 330.410070 1168.801917 324.518848 1170.513244 329.427862 1172.224571 329.427862 1173.935897 330.410070 1175.647224 329.427862 1177.358551 330.410070 1179.069878 330.410070 1180.781204 329.427862 1182.492531 328.445654 1184.203858 329.427862 1185.915184 329.427862 1187.626511 329.427862 1189.337838 322.554433 1191.049165 330.410070 1192.760491 330.410070 1194.471818 330.410070 1196.183145 325.499031 1197.894471 323.536641 1199.605798 329.427862 1201.317125 329.427862 1203.028452 327.463446 1204.739778 329.427862 1206.451105 330.410070 1208.162432 329.427862 1209.873758 329.427862 1211.585085 330.410070 1213.296412 329.427862 1215.007739 324.518848 1216.719065 330.410070 1218.430392 328.445654 1220.141719 328.445654 1221.853045 331.392278 1223.564372 324.518848 1225.275699 330.410070 1226.987025 328.445654 1228.698352 330.410070 1230.409679 328.445654 1232.121006 329.427862 1233.832332 329.427862 1235.543659 322.554433 1237.254986 329.427862 1238.966312 328.445654 1240.677639 322.554433 1242.388966 329.427862 1244.100293 330.410070 1245.811619 328.445654 1247.522946 328.445654 1249.234273 329.427862 1250.945599 324.518848 1252.656926 329.427862 1254.368253 329.427862 1256.079580 330.410070 1257.790906 328.445654 1259.502233 329.427862 1261.213560 329.427862 1262.924886 329.427862 1264.636213 330.410070 1266.347540 323.536641 1268.058867 330.410070 1269.770193 330.410070 1271.481520 329.427862 1273.192847 329.427862 1274.904173 330.410070 1276.615500 329.427862 1278.326827 324.518848 1280.038154 329.427862 1281.749480 329.427862 1283.460807 330.410070 1285.172134 329.427862 1286.883460 329.427862 1288.594787 328.445654 1290.306114 329.427862 1292.017441 323.536641 1293.728767 330.410070 1295.440094 330.410070 1297.151421 329.427862 1298.862747 330.410070 1300.574074 330.410070 1302.285401 329.427862 1303.996727 329.427862 1305.708054 325.499031 1307.419381 321.572225 1309.130708 329.427862 1310.842034 329.427862 1312.553361 329.427862 1314.264688 329.427862 1315.976014 329.427862 1317.687341 324.518848 1319.398668 328.445654 1321.109995 329.427862 1322.821321 330.410070 1324.532648 330.410070 1326.243975 328.445654 1327.955301 330.410070 1329.666628 328.445654 1331.377955 329.427862 1333.089282 324.518848 1334.800608 329.427862 1336.511935 330.410070 1338.223262 330.410070 1339.934588 328.445654 1341.645915 330.410070 1343.357242 323.536641 1345.068569 329.427862 1346.779895 328.445654 1348.491222 328.445654 1350.202549 330.410070 1351.913875 330.410070 1353.625202 330.410070 1355.336529 307.825367 1357.047856 327.463446 1358.759182 330.410070 1360.470509 322.554433 1362.181836 330.410070 1363.893162 329.427862 1365.604489 329.427862 1367.315816 329.427862 1369.027143 244.002113 1370.738469 215.526188 1372.449796 309.789782 1374.161123 324.518848 1375.872449 327.463446 1377.583776 329.427862 1379.295103 319.607809 1381.006430 329.427862 1382.717756 328.445654 1384.429083 329.427862 1386.140410 329.427862 1387.851736 323.536641 1389.563063 330.410070 1391.274390 330.410070 1392.985716 322.554433 1394.697043 328.445654 1396.408370 330.410070 1398.119697 330.410070 1399.831023 329.427862 1401.542350 328.445654 1403.253677 329.427862 1404.965003 329.427862 1406.676330 329.427862 1408.387657 329.427862 1410.098984 329.427862 1411.810310 330.410070 1413.521637 329.427862 1415.232964 325.499031 1416.944290 329.427862 1418.655617 323.536641 1420.366944 329.427862 1422.078271 329.427862 1423.789597 330.410070 1425.500924 329.427862 1427.212251 329.427862 1428.923577 330.410070 1430.634904 328.445654 1432.346231 329.427862 1434.057558 330.410070 1435.768884 330.410070 1437.480211 329.427862 1439.191538 329.427862 1440.902864 330.410070 1442.614191 324.518848 1444.325518 321.572225 1446.036845 330.410070 1447.748171 330.410070 1449.459498 330.410070 1451.170825 322.554433 1452.882151 329.427862 1454.593478 330.410070 1456.304805 330.410070 1458.016132 330.410070 1459.727458 330.410070 1461.438785 330.410070 1463.150112 329.427862 1464.861438 328.445654 1466.572765 330.410070 1468.284092 329.427862 1469.995418 319.607809 1471.706745 329.427862 1473.418072 329.427862 1475.129399 329.427862 1476.840725 329.427862 1478.552052 329.427862 1480.263379 330.410070 1481.974705 329.427862 1483.686032 329.427862 1485.397359 329.427862 1487.108686 331.392278 1488.820012 330.410070 1490.531339 330.410070 1492.242666 329.427862 1493.953992 328.445654 1495.665319 322.554433 1497.376646 324.518848 1499.087973 330.410070 1500.799299 330.410070 1502.510626 330.410070 1504.221953 329.427862 1505.933279 330.410070 1507.644606 329.427862 1509.355933 330.410070 1511.067260 329.427862 1512.778586 330.410070 1514.489913 331.392278 1516.201240 330.410070 1517.912566 329.427862 1519.623893 330.410070 1521.335220 323.536641 1523.046547 323.536641 1524.757873 324.518848 1526.469200 329.427862 1528.180527 330.410070 1529.891853 330.410070 1531.603180 306.843159 1533.314507 329.427862 1535.025834 330.410070 1536.737160 329.427862 1538.448487 330.410070 1540.159814 330.410070 1541.871140 329.427862 1543.582467 330.410070 1545.293794 330.410070 1547.005121 209.634967 1548.716447 275.422636 1550.427774 222.399618 1552.139101 318.627627 1553.850427 325.499031 1555.561754 327.463446 1557.273081 328.445654 1558.984407 328.445654 1560.695734 326.481239 1562.407061 327.463446 1564.118388 328.445654 1565.829714 329.427862 1567.541041 329.427862 1569.252368 328.445654 1570.963694 328.445654 1572.675021 329.427862 1574.386348 328.445654 1576.097675 328.445654 1577.809001 323.536641 1579.520328 329.427862 1581.231655 328.445654 1582.942981 329.427862 1584.654308 328.445654 1586.365635 327.463446 1588.076962 329.427862 1589.788288 328.445654 1591.499615 328.445654 1593.210942 325.499031 1594.922268 321.572225 1596.633595 328.445654 1598.344922 329.427862 1600.056249 329.427862 1601.767575 330.410070 1603.478902 329.427862 1605.190229 323.536641 1606.901555 329.427862 1608.612882 329.427862 1610.324209 329.427862 1612.035536 329.427862 1613.746862 329.427862 1615.458189 329.427862 1617.169516 329.427862 1618.880842 321.572225 1620.592169 326.481239 1622.303496 327.463446 1624.014823 328.445654 1625.726149 329.427862 1627.437476 328.445654 1629.148803 329.427862 1630.860129 329.427862 1632.571456 324.518848 1634.282783 329.427862 1635.994109 329.427862 1637.705436 329.427862 1639.416763 329.427862 1641.128090 330.410070 1642.839416 329.427862 1644.550743 325.499031 1646.262070 329.427862 1647.973396 329.427862 1649.684723 329.427862 1651.396050 328.445654 1653.107377 329.427862 1654.818703 328.445654 1656.530030 329.427862 1658.241357 329.427862 1659.952683 324.518848 1661.664010 328.445654 1663.375337 328.445654 1665.086664 329.427862 1666.797990 324.518848 1668.509317 329.427862 1670.220644 322.554433 1671.931970 326.481239 1673.643297 330.410070 1675.354624 329.427862 1677.065951 329.427862 1678.777277 328.445654 1680.488604 330.410070 1682.199931 330.410070 1683.911257 328.445654 1685.622584 329.427862 1687.333911 324.518848 1689.045238 329.427862 1690.756564 329.427862 1692.467891 329.427862 1694.179218 328.445654 1695.890544 325.499031 1697.601871 330.410070 1699.313198 330.410070 1701.024525 329.427862 1702.735851 330.410070 1704.447178 328.445654 1706.158505 329.427862 1707.869831 329.427862 1709.581158 329.427862 1711.292485 330.410070 1713.003812 329.427862 1714.715138 325.499031 1716.426465 330.410070 1718.137792 330.410070 1719.849118 329.427862 1721.560445 324.518848 1723.271772 325.499031 1724.983098 330.410070 1726.694425 330.410070 1728.405752 329.427862 1730.117079 306.843159 1731.828405 328.445654 1733.539732 329.427862 1735.251059 328.445654 1736.962385 330.410070 1738.673712 323.536641 1740.385039 330.410070 1742.096366 325.499031 1743.807692 328.445654" /></g></g><g class="titles"><text class="title plot_title" x="1000.0" y="26">Time per iteration</text></g><g class="plot overlay" transform="translate(202, 46)"><g class="series serie-0 color-0" /><g class="series serie-1 color-1" /><g class="series serie-2 color-2" /></g><g class="plot text-overlay" transform="translate(202, 46)"><g class="series serie-0 color-0" /><g class="series serie-1 color-1" /><g class="series serie-2 color-2" /></g><g class="plot tooltip-overlay" transform="translate(202, 46)"><g class="tooltip" style="opacity: 0" transform="translate(0 0)"><rect class="tooltip-box" height="0" rx="0" ry="0" width="0" /><g class="text" /></g></g><g class="legends" transform="translate(10, 56)"><g class="legend reactive activate-serie" id="activate-serie-0"><rect class="color-0 reactive" height="12" width="12" x="0.0" y="1.0" /><text x="17.0" y="11.2">Roundtrip (ms)</text></g><g class="legend reactive activate-serie" id="activate-serie-1"><rect class="color-1 reactive" height="12" width="12" x="0.0" y="22.0" /><text x="17.0" y="32.2">Write to child…</text><title>Write to child (ms)</title></g><g class="legend reactive activate-serie" id="activate-serie-2"><rect class="color-2 reactive" height="12" width="12" x="0.0" y="43.0" /><text x="17.0" y="53.2">Child wait (ms)</text></g></g><g class="legends" transform="translate(1990, 56)" /></g></svg>
"""Aggregate STDIO results"""
import os
import sys
import json
import pygal
import subprocess
from collections import defaultdict
dp0 = os.path.dirname(__file__)
fname = os.path.join(dp0, "subprocess_profile.py")
oname = os.path.join(dp0, "output.json")
pname = os.path.join(dp0, "aggplot.svg")
rname = os.path.join(dp0, "results.json")
def run(sizes):
data = dict()
for size in sizes:
if size != 1 and size % 100 != 0:
continue
print("bytes: %d" % size)
subprocess.call([
sys.executable,
"stdio_cli.py",
"--iterations", str(10000),
"--bytes", str(size),
"--output", oname,
])
with open(oname) as f:
results = json.load(f)
data[str(size)] = results
print("Writing data to '%s'" % rname)
with open(rname, "w") as f:
json.dump(data, f, indent=2)
if not os.path.exists(rname):
run(sizes=range(1, 10000 + 1))
with open(rname) as f:
data = json.load(f)
sizes = list()
times = defaultdict(list)
for size, result in data.items():
sizes.append(size)
for key, value in result.items():
if key in ("mintime", "avgtime"):
value *= 1000 # microseconds
key += " (mu)"
if key == "bps":
value /= 10 ** 6
key = "mbps"
times[key].append(value)
print("Plotting to %s.." % pname)
plot = pygal.Line(width=2000, height=500)
plot.title = "Time relative size"
for key, values in times.items():
if key in ("iterations", "totb", "bpi",
"maxtime", "deltime", "totdur"):
continue
plot.add(key, values, show_dots=False)
plot.x_labels = sizes
plot.render_to_file(pname)
"""Subprocess IPC communication test
Determine the throughput and bandwidth of standard Python
subprocess interprocess communication.
"""
import os
import sys
import time
import pstats
import logging
import cProfile
import argparse
import subprocess
logging.basicConfig(format="%(name)s: %(message)s")
parser = argparse.ArgumentParser()
parser.add_argument("-o", "--output")
parser.add_argument("-i", "--iterations", default=100, type=int)
parser.add_argument("-b", "--bytes", default=1000, type=int)
parser.add_argument("-s", "--stats", action="store_true",
help="Print additional stats")
parser.add_argument("-p", "--plot", action="store_true")
parser.add_argument("-q", "--quiet", action="store_true")
opt = parser.parse_args()
if not os.getenv("CHILD"):
# Parent Process
#
# This block boots up another Python interpreter
# so as to send messages back and forth.
# ______________
# | |
# | |
# | PARENT |
# | |
# |______________|
#
log = logging.getLogger("<-- PY")
log.setLevel(logging.INFO)
log.info("Booting child..")
popen = subprocess.Popen(
# Open yourself, but run the below block
[sys.executable, __file__],
env=dict(os.environ, **{"CHILD": "1"}),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
bufsize=-1,
universal_newlines=True,
)
# Wait for child to get ready..
response = popen.stdout.readline()
assert response == "Ready\n", "Was: '%s'" % response
# Data the size of opt.bytes
data = "0".zfill(opt.bytes)
bytes_ = sys.getsizeof(data)
log.info("Created data {:,} bytes (len {})".format(
bytes_, len(data)
))
write_per_iteration = list()
rtrip_per_iteration = list() # roundtrip
child_wait_times = list()
times = list()
if opt.stats:
profile = cProfile.Profile()
profile.enable()
tot0 = time.clock()
for i in range(opt.iterations):
# Write
write0 = time.clock()
popen.stdin.write(data)
popen.stdin.write("%d\n" % i)
popen.stdin.flush()
write1 = time.clock()
# Read
read0 = time.clock()
response = popen.stdout.readline()
read1 = time.clock()
write_per_iteration.append((write1 - write0) * 1000)
rtrip_per_iteration.append((read1 - read0) * 1000)
times.append(read1)
index, wait = response.rsplit("-", 1)
response = int(index)
wait = float(wait)
child_wait_times.append(wait)
assert response == i, "Was %d, expected %d" % (response, i)
if not opt.quiet and (opt.iterations > 1000 and i % 100 == 0):
sys.stderr.write("\r%d/%d.." % (i, opt.iterations))
if not opt.quiet:
sys.stderr.write("\r%d/%d..\n" % (opt.iterations, opt.iterations))
if opt.stats:
profile.disable()
stats = pstats.Stats(profile).sort_stats("time")
stats.print_stats(20)
tot1 = time.clock()
totdur = tot1 - tot0 # s
# Send kill signal
popen.kill()
popen.wait()
def plot():
import pygal
fname = os.path.join(os.getcwd(), "plot.svg")
log.info("Plotting to %s.." % fname)
assert rtrip_per_iteration
assert write_per_iteration
assert child_wait_times
plot = pygal.Line(width=2000, height=500)
plot.title = "Time per iteration"
plot.add("Roundtrip (ms)", rtrip_per_iteration, show_dots=False)
plot.add("Write to child (ms)", write_per_iteration, show_dots=False)
plot.add("Child wait (ms)", child_wait_times, show_dots=False)
# plot.x_labels = times
plot.render_to_file(fname)
if opt.plot:
try:
plot()
except ImportError:
log.info("Plotting skipped, could not find pygal")
iterations = opt.iterations
bpi = bytes_ * 2
totb = opt.iterations * bpi # in + out
bps = totb / (totdur)
avgtime = (sum(rtrip_per_iteration) / len(rtrip_per_iteration))
mintime = min(rtrip_per_iteration)
maxtime = max(rtrip_per_iteration)
deltime = maxtime - mintime
results = (
("iterations", opt.iterations),
("bpi", bytes_ * 2),
("bps", bps),
("avgtime", avgtime),
("mintime", mintime),
("maxtime", maxtime),
("deltime", deltime),
("totb", totb),
("totdur", totdur),
)
if opt.output:
import json
with open(opt.output, "w") as f:
log.info("Writing results to '%s'" % opt.output)
json.dump(dict(results), f, indent=2, sort_keys=True)
print("""\
Iterations: {iterations:,}
Bytes/iteration: {bpi:,} b/i
Bytes/second: {bps:,.0f} b/s
Avarage roundtrip time: {avgtime:.3f} ms
Min roundtrip time: {mintime:.3f} ms
Max roundtrip time: {maxtime:.3f} ms
Delta roundtrip time: {deltime:.3f} ms
Total bytes: {totb:,} b
Total time: {totdur:.3f} s
""".format(**locals()))
else:
# Child Process
#
# This block represents the additional Python interpreter which
# is receiving messages via sys.stdin from the above parent.
# _____________
# | |
# | |
# | CHILD |
# | |
# |_____________|
#
log = logging.getLogger("--> MO")
log.setLevel(logging.INFO)
log.info("Ready for action..")
sys.stdout.write("Ready\n")
sys.stdout.flush()
t0 = None
while True:
line = sys.stdin.readline().rstrip()
# Wait time
t1 = time.clock()
duration = "-%.6f\n" % ((t1 - (t0 or t1)) * 1000)
sys.stdout.write(line)
sys.stdout.write(duration)
sys.stdout.flush()
t0 = time.clock()
log.info("Dying..")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment