Skip to content

Instantly share code, notes, and snippets.

@miku
Last active December 8, 2018 03:43
Show Gist options
  • Save miku/47950c4abd90319ec85d to your computer and use it in GitHub Desktop.
Save miku/47950c4abd90319ec85d to your computer and use it in GitHub Desktop.
Golang XML worker queue example

Parallel XML processing

When working with large XML files, only a streaming approach is feasible, which also helps to work on the data in parallel, since only one record needs to be cosidered at a time.

First version of wikikit parsed the XML element in the main routine and the fan out the parsed struct to the workers. Thanks to pprof, it got clear, why this did not yield major speed improvements - most time was spent in converting a XML token into a struct.

Single routine, tokenization only

Needs about 6.268s to decode and parse 10000 XML elements.

Skipping struct parsing:

decoder := xml.NewDecoder(handle)
var inElement string

for {
	t, _ := decoder.Token()
	if t == nil {
		break
	}
	switch se := t.(type) {
	case xml.StartElement:
		inElement = se.Name.Local
		if inElement == "page" {
			// ...
		}
	default:
	}
}

gets the speed down to 0.433s. Just tokenizing through a 34G XML file with a single routine takes 39m21.517s saturating a single core.

Time distribution looks like this: https://cdn.mediacru.sh/DYyiKLBA7U2i.svg

Single routine, struct loading

decoder := xml.NewDecoder(handle)
var inElement string
var p Page

for {
	// Read tokens from the XML document in a stream.
	t, _ := decoder.Token()
	if t == nil {
		break
	}
	// Inspect the type of the token just read.
	switch se := t.(type) {
	case xml.StartElement:
		// If we just read a StartElement token
		inElement = se.Name.Local
		// ...and its name is "page"
		if inElement == "page" {
			// decode a whole chunk of following XML into the
			// variable p which is a Page (se above)
			decoder.DecodeElement(&p, &se)
		}
	default:
	}
}

Observation

Most time is spent actually getting the token out. DecodeElement is not unsignificant. Grepping for </page> in 34G takes finds 15671705 occurences and takes about 16m35.992s.

Distributing decoder.Token() among workers seems not that easy. Workaround could be to

  • split the file into N pieces, while preserving the XML structure,
  • write the N pieces to N files,
  • convert each file in a separate routine,
  • concatenate the result into a single file.
#!/usr/bin/env bash
go tool pprof --web xmlp $1
all:
go fmt xmlp.go
go build xmlp.go
clean:
rm -f xmlp
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
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" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.26.3 (20100126.1600)
-->
<!-- Title: xmlp; 197453 samples Pages: 1 -->
<svg width="100%" height="100%"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<script type="text/ecmascript"><![CDATA[
// SVGPan
// http://www.cyberz.org/blog/2009/12/08/svgpan-a-javascript-svg-panzoomdrag-library/
// Local modification: if(true || ...) below to force panning, never moving.
// Local modification: add clamping to fix bug in handleMouseWheel.
/**
* SVGPan library 1.2
* ====================
*
* Given an unique existing element with id "viewport", including the
* the library into any SVG adds the following capabilities:
*
* - Mouse panning
* - Mouse zooming (using the wheel)
* - Object dargging
*
* Known issues:
*
* - Zooming (while panning) on Safari has still some issues
*
* Releases:
*
* 1.2, Sat Mar 20 08:42:50 GMT 2010, Zeng Xiaohui
* Fixed a bug with browser mouse handler interaction
*
* 1.1, Wed Feb 3 17:39:33 GMT 2010, Zeng Xiaohui
* Updated the zoom code to support the mouse wheel on Safari/Chrome
*
* 1.0, Andrea Leofreddi
* First release
*
* This code is licensed under the following BSD license:
*
* Copyright 2009-2010 Andrea Leofreddi <a.leofreddi@itcharm.com>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of Andrea Leofreddi.
*/
var root = document.documentElement;
var state = 'none', stateTarget, stateOrigin, stateTf;
setupHandlers(root);
/**
* Register handlers
*/
function setupHandlers(root){
setAttributes(root, {
"onmouseup" : "add(evt)",
"onmousedown" : "handleMouseDown(evt)",
"onmousemove" : "handleMouseMove(evt)",
"onmouseup" : "handleMouseUp(evt)",
//"onmouseout" : "handleMouseUp(evt)", // Decomment this to stop the pan functionality when dragging out of the SVG element
});
if(navigator.userAgent.toLowerCase().indexOf('webkit') >= 0)
window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari
else
window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others
var g = svgDoc.getElementById("svg");
g.width = "100%";
g.height = "100%";
}
/**
* Instance an SVGPoint object with given event coordinates.
*/
function getEventPoint(evt) {
var p = root.createSVGPoint();
p.x = evt.clientX;
p.y = evt.clientY;
return p;
}
/**
* Sets the current transform matrix of an element.
*/
function setCTM(element, matrix) {
var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")";
element.setAttribute("transform", s);
}
/**
* Dumps a matrix to a string (useful for debug).
*/
function dumpMatrix(matrix) {
var s = "[ " + matrix.a + ", " + matrix.c + ", " + matrix.e + "\n " + matrix.b + ", " + matrix.d + ", " + matrix.f + "\n 0, 0, 1 ]";
return s;
}
/**
* Sets attributes of an element.
*/
function setAttributes(element, attributes){
for (i in attributes)
element.setAttributeNS(null, i, attributes[i]);
}
/**
* Handle mouse move event.
*/
function handleMouseWheel(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
var delta;
if(evt.wheelDelta)
delta = evt.wheelDelta / 3600; // Chrome/Safari
else
delta = evt.detail / -90; // Mozilla
var z = 1 + delta; // Zoom factor: 0.9/1.1
// Clamp to reasonable values.
// The 0.1 check is important because
// a very large scroll can turn into a
// negative z, which rotates the image 180 degrees.
if(z < 0.1)
z = 0.1;
if(z > 10.0)
z = 10.0;
var g = svgDoc.getElementById("viewport");
var p = getEventPoint(evt);
p = p.matrixTransform(g.getCTM().inverse());
// Compute new scale matrix in current mouse position
var k = root.createSVGMatrix().translate(p.x, p.y).scale(z).translate(-p.x, -p.y);
setCTM(g, g.getCTM().multiply(k));
stateTf = stateTf.multiply(k.inverse());
}
/**
* Handle mouse move event.
*/
function handleMouseMove(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
var g = svgDoc.getElementById("viewport");
if(state == 'pan') {
// Pan mode
var p = getEventPoint(evt).matrixTransform(stateTf);
setCTM(g, stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y));
} else if(state == 'move') {
// Move mode
var p = getEventPoint(evt).matrixTransform(g.getCTM().inverse());
setCTM(stateTarget, root.createSVGMatrix().translate(p.x - stateOrigin.x, p.y - stateOrigin.y).multiply(g.getCTM().inverse()).multiply(stateTarget.getCTM()));
stateOrigin = p;
}
}
/**
* Handle click event.
*/
function handleMouseDown(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
var g = svgDoc.getElementById("viewport");
if(true || evt.target.tagName == "svg") {
// Pan mode
state = 'pan';
stateTf = g.getCTM().inverse();
stateOrigin = getEventPoint(evt).matrixTransform(stateTf);
} else {
// Move mode
state = 'move';
stateTarget = evt.target;
stateTf = g.getCTM().inverse();
stateOrigin = getEventPoint(evt).matrixTransform(stateTf);
}
}
/**
* Handle mouse button release event.
*/
function handleMouseUp(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
if(state == 'pan' || state == 'move') {
// Quit pan mode
state = '';
}
}
]]></script>
<g id="viewport" transform="translate(0,0)">
<g id="viewport" class="graph" transform="scale(1 1) rotate(0) translate(4 2110)">
<title>xmlp; 197453 samples</title>
<polygon fill="white" stroke="white" points="-4,5 -4,-2110 2938,-2110 2938,5 -4,5"/>
<!-- Legend -->
<g id="node1" class="node"><title>Legend</title>
<text text-anchor="start" x="1409.5" y="-2079.9" font-family="Times Roman,serif" font-size="24.00">xmlp</text>
<text text-anchor="start" x="1409.5" y="-2050.9" font-family="Times Roman,serif" font-size="24.00">Total samples: 197453</text>
<text text-anchor="start" x="1409.5" y="-2021.9" font-family="Times Roman,serif" font-size="24.00">Focusing on: 197453</text>
<text text-anchor="start" x="1409.5" y="-1992.9" font-family="Times Roman,serif" font-size="24.00">Dropped nodes with &lt;= 987 abs(samples)</text>
<text text-anchor="start" x="1409.5" y="-1963.9" font-family="Times Roman,serif" font-size="24.00">Dropped edges with &lt;= 197 samples</text>
</g>
<!-- N1 -->
<g id="node2" class="node"><title>N1</title>
<polygon fill="none" stroke="black" points="2045,-1790 1941,-1790 1941,-1746 2045,-1746 2045,-1790"/>
<text text-anchor="middle" x="1993" y="-1777.9" font-family="Times Roman,serif" font-size="9.00">main.main</text>
<text text-anchor="end" x="2037" y="-1765.9" font-family="Times Roman,serif" font-size="9.00">78 (0.0%)</text>
<text text-anchor="end" x="2037" y="-1753.9" font-family="Times Roman,serif" font-size="9.00">of 187797 (95.1%)</text>
</g>
<!-- N4 -->
<g id="node5" class="node"><title>N4</title>
<polygon fill="none" stroke="black" points="2092,-1590 1894,-1590 1894,-1534 2092,-1534 2092,-1590"/>
<text text-anchor="middle" x="1993" y="-1574.93" font-family="Times Roman,serif" font-size="12.30">encoding/xml.(*Decoder).Token</text>
<text text-anchor="end" x="2084.5" y="-1558.93" font-family="Times Roman,serif" font-size="12.30">1491 (0.8%)</text>
<text text-anchor="end" x="2084.5" y="-1542.93" font-family="Times Roman,serif" font-size="12.30">of 183142 (92.8%)</text>
</g>
<!-- N1&#45;&gt;N4 -->
<g id="edge156" class="edge"><title>N1&#45;&gt;N4</title>
<path fill="none" stroke="black" stroke-width="2" d="M1993,-1745.95C1993,-1711.15 1993,-1643.02 1993,-1600.15"/>
<polygon fill="black" stroke="black" points="1996.5,-1600.1 1993,-1590.1 1989.5,-1600.1 1996.5,-1600.1"/>
<text text-anchor="middle" x="2020.5" y="-1664.4" font-family="Times Roman,serif" font-size="14.00">182684</text>
</g>
<!-- N39 -->
<g id="node40" class="node"><title>N39</title>
<polygon fill="none" stroke="black" points="1957,-1691.5 1787,-1691.5 1787,-1644.5 1957,-1644.5 1957,-1691.5"/>
<text text-anchor="middle" x="1872" y="-1678.14" font-family="Times Roman,serif" font-size="10.40">encoding/xml.Comment.Copy</text>
<text text-anchor="end" x="1949" y="-1665.14" font-family="Times Roman,serif" font-size="10.40">452 (0.2%)</text>
<text text-anchor="end" x="1949" y="-1652.14" font-family="Times Roman,serif" font-size="10.40">of 2963 (1.5%)</text>
</g>
<!-- N1&#45;&gt;N39 -->
<g id="edge68" class="edge"><title>N1&#45;&gt;N39</title>
<path fill="none" stroke="black" d="M1964.23,-1745.79C1956.93,-1740.06 1949.13,-1733.85 1942,-1728 1930.45,-1718.53 1918.01,-1707.98 1906.88,-1698.41"/>
<polygon fill="black" stroke="black" points="1908.88,-1695.52 1899.03,-1691.64 1904.31,-1700.82 1908.88,-1695.52"/>
<text text-anchor="middle" x="1960.5" y="-1715.4" font-family="Times Roman,serif" font-size="14.00">2963</text>
</g>
<!-- N47 -->
<g id="node48" class="node"><title>N47</title>
<polygon fill="none" stroke="black" points="2226,-1691.5 2066,-1691.5 2066,-1644.5 2226,-1644.5 2226,-1691.5"/>
<text text-anchor="middle" x="2146" y="-1678.23" font-family="Times Roman,serif" font-size="10.30">encoding/xml.ProcInst.Copy</text>
<text text-anchor="end" x="2218" y="-1665.23" font-family="Times Roman,serif" font-size="10.30">410 (0.2%)</text>
<text text-anchor="end" x="2218" y="-1652.23" font-family="Times Roman,serif" font-size="10.30">of 1694 (0.9%)</text>
</g>
<!-- N1&#45;&gt;N47 -->
<g id="edge8" class="edge"><title>N1&#45;&gt;N47</title>
<path fill="none" stroke="black" d="M2026.96,-1745.81C2048.91,-1731.46 2077.72,-1712.63 2101.5,-1697.09"/>
<polygon fill="black" stroke="black" points="2103.55,-1699.93 2110.01,-1691.52 2099.72,-1694.07 2103.55,-1699.93"/>
<text text-anchor="middle" x="2097.5" y="-1715.4" font-family="Times Roman,serif" font-size="14.00">1694</text>
</g>
<!-- N2 -->
<g id="node3" class="node"><title>N2</title>
<polygon fill="none" stroke="black" points="2040,-2048 1946,-2048 1946,-2010 2040,-2010 2040,-2048"/>
<text text-anchor="middle" x="1993" y="-2036.8" font-family="Times Roman,serif" font-size="8.00">resetspinning</text>
<text text-anchor="end" x="2032.5" y="-2026.8" font-family="Times Roman,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="2032.5" y="-2016.8" font-family="Times Roman,serif" font-size="8.00">of 187797 (95.1%)</text>
</g>
<!-- N3 -->
<g id="node4" class="node"><title>N3</title>
<polygon fill="none" stroke="black" points="2046,-1890 1940,-1890 1940,-1852 2046,-1852 2046,-1890"/>
<text text-anchor="middle" x="1993" y="-1878.8" font-family="Times Roman,serif" font-size="8.00">runtime.printcomplex</text>
<text text-anchor="end" x="2038.5" y="-1868.8" font-family="Times Roman,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="2038.5" y="-1858.8" font-family="Times Roman,serif" font-size="8.00">of 187797 (95.1%)</text>
</g>
<!-- N2&#45;&gt;N3 -->
<g id="edge38" class="edge"><title>N2&#45;&gt;N3</title>
<path fill="none" stroke="black" stroke-width="2" d="M1993,-2009.94C1993,-1982.66 1993,-1932.23 1993,-1900.22"/>
<polygon fill="black" stroke="black" points="1996.5,-1900.13 1993,-1890.13 1989.5,-1900.13 1996.5,-1900.13"/>
<text text-anchor="middle" x="2020.5" y="-1921.4" font-family="Times Roman,serif" font-size="14.00">187797</text>
</g>
<!-- N3&#45;&gt;N1 -->
<g id="edge52" class="edge"><title>N3&#45;&gt;N1</title>
<path fill="none" stroke="black" stroke-width="2" d="M1993,-1851.63C1993,-1837.15 1993,-1817.03 1993,-1800.16"/>
<polygon fill="black" stroke="black" points="1996.5,-1800.15 1993,-1790.15 1989.5,-1800.15 1996.5,-1800.15"/>
<text text-anchor="middle" x="2020.5" y="-1813.4" font-family="Times Roman,serif" font-size="14.00">187797</text>
</g>
<!-- N4&#45;&gt;N4 -->
<g id="edge88" class="edge"><title>N4&#45;&gt;N4</title>
<path fill="none" stroke="black" d="M2092.01,-1570.52C2102.94,-1568.9 2110,-1566.06 2110,-1562 2110,-1559.4 2107.1,-1557.3 2102.15,-1555.7"/>
<polygon fill="black" stroke="black" points="2102.53,-1552.2 2092.01,-1553.48 2101.03,-1559.04 2102.53,-1552.2"/>
<text text-anchor="middle" x="2124" y="-1558.4" font-family="Times Roman,serif" font-size="14.00">909</text>
</g>
<!-- N5 -->
<g id="node6" class="node"><title>N5</title>
<polygon fill="none" stroke="black" points="2099,-1479.5 1887,-1479.5 1887,-1432.5 2099,-1432.5 2099,-1479.5"/>
<text text-anchor="middle" x="1993" y="-1466.14" font-family="Times Roman,serif" font-size="10.40">encoding/xml.(*Decoder).popElement</text>
<text text-anchor="end" x="2091.5" y="-1453.14" font-family="Times Roman,serif" font-size="10.40">469 (0.2%)</text>
<text text-anchor="end" x="2091.5" y="-1440.14" font-family="Times Roman,serif" font-size="10.40">of 146965 (74.4%)</text>
</g>
<!-- N4&#45;&gt;N5 -->
<g id="edge32" class="edge"><title>N4&#45;&gt;N5</title>
<path fill="none" stroke="black" stroke-width="2" d="M1993,-1533.87C1993,-1520.38 1993,-1504.11 1993,-1489.94"/>
<polygon fill="black" stroke="black" points="1996.5,-1489.59 1993,-1479.59 1989.5,-1489.59 1996.5,-1489.59"/>
<text text-anchor="middle" x="2020.5" y="-1503.4" font-family="Times Roman,serif" font-size="14.00">146965</text>
</g>
<!-- N7 -->
<g id="node8" class="node"><title>N7</title>
<polygon fill="none" stroke="black" points="2388,-1077.5 1938,-1077.5 1938,-976.5 2388,-976.5 2388,-1077.5"/>
<text text-anchor="middle" x="2163" y="-1050.91" font-family="Times Roman,serif" font-size="25.10">encoding/xml.(*Decoder).rawToken</text>
<text text-anchor="end" x="2380" y="-1019.91" font-family="Times Roman,serif" font-size="25.10">23074 (11.7%)</text>
<text text-anchor="end" x="2380" y="-988.91" font-family="Times Roman,serif" font-size="25.10">of 62335 (31.6%)</text>
</g>
<!-- N4&#45;&gt;N7 -->
<g id="edge54" class="edge"><title>N4&#45;&gt;N7</title>
<path fill="none" stroke="black" d="M2092.2,-1558.62C2301.67,-1550.15 2770,-1523.65 2770,-1456 2770,-1456 2770,-1456 2770,-1180 2770,-1157.06 2768.32,-1147.05 2751,-1132 2699.58,-1087.31 2668.96,-1108.59 2602,-1096 2543.38,-1084.98 2527.98,-1086.9 2469,-1078 2445.95,-1074.52 2421.94,-1070.76 2397.97,-1066.91"/>
<polygon fill="black" stroke="black" points="2398.49,-1063.45 2388.06,-1065.32 2397.38,-1070.36 2398.49,-1063.45"/>
<text text-anchor="middle" x="2793" y="-1326.4" font-family="Times Roman,serif" font-size="14.00">29606</text>
</g>
<!-- N22 -->
<g id="node23" class="node"><title>N22</title>
<polygon fill="none" stroke="black" points="2372,-911.5 2270,-911.5 2270,-858.5 2372,-858.5 2372,-911.5"/>
<text text-anchor="middle" x="2321" y="-897.06" font-family="Times Roman,serif" font-size="11.60">itab</text>
<text text-anchor="end" x="2364.5" y="-882.06" font-family="Times Roman,serif" font-size="11.60">1011 (0.5%)</text>
<text text-anchor="end" x="2364.5" y="-867.06" font-family="Times Roman,serif" font-size="11.60">of 7223 (3.7%)</text>
</g>
<!-- N4&#45;&gt;N22 -->
<g id="edge20" class="edge"><title>N4&#45;&gt;N22</title>
<path fill="none" stroke="black" d="M2092.29,-1559.83C2316.77,-1553.61 2844,-1531 2844,-1456 2844,-1456 2844,-1456 2844,-1027 2844,-932.228 2520.11,-898.679 2382.1,-888.685"/>
<polygon fill="black" stroke="black" points="2382.32,-885.192 2372.1,-887.978 2381.83,-892.174 2382.32,-885.192"/>
<text text-anchor="middle" x="2862.5" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">1306</text>
</g>
<!-- N36 -->
<g id="node37" class="node"><title>N36</title>
<polygon fill="none" stroke="black" points="2425,-1209.5 2227,-1209.5 2227,-1150.5 2425,-1150.5 2425,-1209.5"/>
<text text-anchor="middle" x="2326" y="-1193.17" font-family="Times Roman,serif" font-size="13.70">runtime.mapaccess1_fast64</text>
<text text-anchor="end" x="2417" y="-1176.17" font-family="Times Roman,serif" font-size="13.70">2574 (1.3%)</text>
<text text-anchor="end" x="2417" y="-1159.17" font-family="Times Roman,serif" font-size="13.70">of 3747 (1.9%)</text>
</g>
<!-- N4&#45;&gt;N36 -->
<g id="edge112" class="edge"><title>N4&#45;&gt;N36</title>
<path fill="none" stroke="black" d="M2092.14,-1537.3C2217.07,-1503.95 2420.74,-1441.34 2464,-1378 2488.06,-1342.77 2483.21,-1320.1 2464,-1282 2449.78,-1253.8 2423.67,-1231.46 2397.95,-1214.97"/>
<polygon fill="black" stroke="black" points="2399.61,-1211.88 2389.27,-1209.6 2395.93,-1217.84 2399.61,-1211.88"/>
<text text-anchor="middle" x="2461" y="-1401.4" font-family="Times Roman,serif" font-size="14.00">413</text>
</g>
<!-- N37 -->
<g id="node38" class="node"><title>N37</title>
<polygon fill="none" stroke="black" points="2742,-1203.5 2554,-1203.5 2554,-1156.5 2742,-1156.5 2742,-1203.5"/>
<text text-anchor="middle" x="2648" y="-1190.86" font-family="Times Roman,serif" font-size="9.60">encoding/xml.(*Decoder).autoClose</text>
<text text-anchor="end" x="2734" y="-1177.86" font-family="Times Roman,serif" font-size="9.60">214 (0.1%)</text>
<text text-anchor="end" x="2734" y="-1164.86" font-family="Times Roman,serif" font-size="9.60">of 3281 (1.7%)</text>
</g>
<!-- N4&#45;&gt;N37 -->
<g id="edge78" class="edge"><title>N4&#45;&gt;N37</title>
<path fill="none" stroke="black" d="M2092.13,-1545.11C2228.63,-1520.15 2465.11,-1470.26 2531,-1414 2594.02,-1360.2 2626.64,-1264.24 2640.18,-1213.54"/>
<polygon fill="black" stroke="black" points="2643.6,-1214.29 2642.71,-1203.73 2636.82,-1212.54 2643.6,-1214.29"/>
<text text-anchor="middle" x="2567.5" y="-1401.4" font-family="Times Roman,serif" font-size="14.00">3281</text>
</g>
<!-- N6 -->
<g id="node7" class="node"><title>N6</title>
<polygon fill="none" stroke="black" points="1748,-1377.5 1374,-1377.5 1374,-1282.5 1748,-1282.5 1748,-1377.5"/>
<text text-anchor="middle" x="1561" y="-1352.17" font-family="Times Roman,serif" font-size="23.70">encoding/xml.(*Decoder).text</text>
<text text-anchor="end" x="1740.5" y="-1323.17" font-family="Times Roman,serif" font-size="23.70">19529 (9.9%)</text>
<text text-anchor="end" x="1740.5" y="-1294.17" font-family="Times Roman,serif" font-size="23.70">of 127176 (64.4%)</text>
</g>
<!-- N5&#45;&gt;N6 -->
<g id="edge12" class="edge"><title>N5&#45;&gt;N6</title>
<path fill="none" stroke="black" stroke-width="2" d="M1977.55,-1432.21C1967.98,-1419.45 1954.57,-1404.62 1939,-1396 1906.92,-1378.25 1832.56,-1363.56 1758.2,-1352.59"/>
<polygon fill="black" stroke="black" points="1758.59,-1349.11 1748.19,-1351.13 1757.58,-1356.03 1758.59,-1349.11"/>
<text text-anchor="middle" x="1989.5" y="-1401.4" font-family="Times Roman,serif" font-size="14.00">105838</text>
</g>
<!-- N5&#45;&gt;N7 -->
<g id="edge62" class="edge"><title>N5&#45;&gt;N7</title>
<path fill="none" stroke="black" d="M2099.11,-1451.06C2246.88,-1443.66 2498.2,-1428.96 2512,-1414 2518.18,-1407.3 2591.02,-1248.09 2502,-1132 2486.54,-1111.83 2445.83,-1093.76 2397.76,-1078.52"/>
<polygon fill="black" stroke="black" points="2398.64,-1075.13 2388.05,-1075.51 2396.57,-1081.82 2398.64,-1075.13"/>
<text text-anchor="middle" x="2560" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">746</text>
</g>
<!-- N9 -->
<g id="node10" class="node"><title>N9</title>
<polygon fill="none" stroke="black" points="2127,-1211 1889,-1211 1889,-1149 2127,-1149 2127,-1211"/>
<text text-anchor="middle" x="2008" y="-1194.49" font-family="Times Roman,serif" font-size="13.90">encoding/xml.(*Decoder).attrval</text>
<text text-anchor="end" x="2119" y="-1176.49" font-family="Times Roman,serif" font-size="13.90">2795 (1.4%)</text>
<text text-anchor="end" x="2119" y="-1158.49" font-family="Times Roman,serif" font-size="13.90">of 22028 (11.2%)</text>
</g>
<!-- N5&#45;&gt;N9 -->
<g id="edge48" class="edge"><title>N5&#45;&gt;N9</title>
<path fill="none" stroke="black" d="M2009.48,-1432.06C2012.58,-1426.38 2015.36,-1420.17 2017,-1414 2034.45,-1348.29 2025.26,-1268.58 2016.79,-1221.19"/>
<polygon fill="black" stroke="black" points="2020.22,-1220.49 2014.95,-1211.3 2013.34,-1221.78 2020.22,-1220.49"/>
<text text-anchor="middle" x="2050" y="-1326.4" font-family="Times Roman,serif" font-size="14.00">21311</text>
</g>
<!-- N16 -->
<g id="node17" class="node"><title>N16</title>
<polygon fill="none" stroke="black" points="1356,-1361 1136,-1361 1136,-1299 1356,-1299 1356,-1361"/>
<text text-anchor="middle" x="1246" y="-1344.4" font-family="Times Roman,serif" font-size="14.00">encoding/xml.(*Decoder).getc</text>
<text text-anchor="end" x="1348.5" y="-1326.4" font-family="Times Roman,serif" font-size="14.00">2857 (1.4%)</text>
<text text-anchor="end" x="1348.5" y="-1308.4" font-family="Times Roman,serif" font-size="14.00">of 11006 (5.6%)</text>
</g>
<!-- N5&#45;&gt;N16 -->
<g id="edge164" class="edge"><title>N5&#45;&gt;N16</title>
<path fill="none" stroke="black" d="M1886.98,-1451.23C1760.85,-1443.64 1544.74,-1424.56 1365,-1378 1351.46,-1374.49 1337.41,-1369.82 1323.91,-1364.77"/>
<polygon fill="black" stroke="black" points="1324.78,-1361.35 1314.19,-1361.03 1322.27,-1367.88 1324.78,-1361.35"/>
<text text-anchor="middle" x="1558" y="-1401.4" font-family="Times Roman,serif" font-size="14.00">10947</text>
</g>
<!-- N24 -->
<g id="node25" class="node"><title>N24</title>
<polygon fill="none" stroke="black" points="2455,-1356 2133,-1356 2133,-1304 2455,-1304 2455,-1356"/>
<text text-anchor="middle" x="2294" y="-1336.43" font-family="Times Roman,serif" font-size="17.30">encoding/xml.(*Decoder).mustgetc</text>
<text text-anchor="end" x="2447" y="-1314.43" font-family="Times Roman,serif" font-size="17.30">6808 (3.4%)</text>
</g>
<!-- N5&#45;&gt;N24 -->
<g id="edge144" class="edge"><title>N5&#45;&gt;N24</title>
<path fill="none" stroke="black" d="M2049.26,-1432.45C2098.22,-1411.95 2169.44,-1382.14 2222.44,-1359.95"/>
<polygon fill="black" stroke="black" points="2223.91,-1363.13 2231.78,-1356.04 2221.21,-1356.68 2223.91,-1363.13"/>
<text text-anchor="middle" x="2153.5" y="-1401.4" font-family="Times Roman,serif" font-size="14.00">6775</text>
</g>
<!-- N6&#45;&gt;N6 -->
<g id="edge96" class="edge"><title>N6&#45;&gt;N6</title>
<path fill="none" stroke="black" stroke-width="1.49349" d="M1748.23,-1339.55C1759.34,-1337.26 1766,-1334.08 1766,-1330 1766,-1327.32 1763.13,-1325.03 1758.02,-1323.13"/>
<polygon fill="black" stroke="black" points="1758.8,-1319.71 1748.23,-1320.45 1756.96,-1326.46 1758.8,-1319.71"/>
<text text-anchor="middle" x="1789" y="-1326.4" font-family="Times Roman,serif" font-size="14.00">49149</text>
</g>
<!-- N6&#45;&gt;N7 -->
<g id="edge72" class="edge"><title>N6&#45;&gt;N7</title>
<path fill="none" stroke="black" d="M1748.2,-1299.45C1913.38,-1272.09 2129.1,-1235.2 2136,-1228 2154.79,-1208.4 2160.74,-1139.47 2162.5,-1087.76"/>
<polygon fill="black" stroke="black" points="2166,-1087.77 2162.8,-1077.67 2159,-1087.56 2166,-1087.77"/>
<text text-anchor="middle" x="2183" y="-1176.4" font-family="Times Roman,serif" font-size="14.00">15840</text>
</g>
<!-- N8 -->
<g id="node9" class="node"><title>N8</title>
<polygon fill="none" stroke="black" points="1525,-1227.5 1205,-1227.5 1205,-1132.5 1525,-1132.5 1525,-1227.5"/>
<text text-anchor="middle" x="1365" y="-1201.99" font-family="Times Roman,serif" font-size="23.90">bytes.(*Buffer).ReadFrom</text>
<text text-anchor="end" x="1517.5" y="-1172.99" font-family="Times Roman,serif" font-size="23.90">19939 (10.1%)</text>
<text text-anchor="end" x="1517.5" y="-1143.99" font-family="Times Roman,serif" font-size="23.90">of 35620 (18.0%)</text>
</g>
<!-- N6&#45;&gt;N8 -->
<g id="edge14" class="edge"><title>N6&#45;&gt;N8</title>
<path fill="none" stroke="black" stroke-width="1.08238" d="M1498.72,-1282.33C1478.53,-1266.88 1456,-1249.64 1435.27,-1233.78"/>
<polygon fill="black" stroke="black" points="1437.19,-1230.84 1427.12,-1227.54 1432.94,-1236.4 1437.19,-1230.84"/>
<text text-anchor="middle" x="1498" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">35620</text>
</g>
<!-- N6&#45;&gt;N9 -->
<g id="edge118" class="edge"><title>N6&#45;&gt;N9</title>
<path fill="none" stroke="black" d="M1714.84,-1282.5C1767.41,-1265.82 1826.44,-1246.59 1880,-1228 1892.15,-1223.78 1904.89,-1219.2 1917.43,-1214.6"/>
<polygon fill="black" stroke="black" points="1918.79,-1217.82 1926.96,-1211.08 1916.37,-1211.26 1918.79,-1217.82"/>
<text text-anchor="middle" x="1834" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">508</text>
</g>
<!-- N11 -->
<g id="node12" class="node"><title>N11</title>
<polygon fill="none" stroke="black" points="432,-1209.5 208,-1209.5 208,-1150.5 432,-1150.5 432,-1209.5"/>
<text text-anchor="middle" x="320" y="-1193.53" font-family="Times Roman,serif" font-size="13.30">encoding/xml.(*Decoder).name</text>
<text text-anchor="end" x="424.5" y="-1176.53" font-family="Times Roman,serif" font-size="13.30">2208 (1.1%)</text>
<text text-anchor="end" x="424.5" y="-1159.53" font-family="Times Roman,serif" font-size="13.30">of 18182 (9.2%)</text>
</g>
<!-- N6&#45;&gt;N11 -->
<g id="edge46" class="edge"><title>N6&#45;&gt;N11</title>
<path fill="none" stroke="black" d="M1373.91,-1283.26C1370.92,-1282.82 1367.95,-1282.39 1365,-1282 1053.89,-1240.43 971.477,-1293.64 659,-1264 561.238,-1254.73 535.626,-1254.26 441,-1228 426.352,-1223.94 411.047,-1218.69 396.443,-1213.17"/>
<polygon fill="black" stroke="black" points="397.55,-1209.85 386.961,-1209.51 395.031,-1216.38 397.55,-1209.85"/>
<text text-anchor="middle" x="682" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">18182</text>
</g>
<!-- N15 -->
<g id="node16" class="node"><title>N15</title>
<polygon fill="none" stroke="black" points="1326,-1056 1054,-1056 1054,-998 1326,-998 1326,-1056"/>
<text text-anchor="middle" x="1190" y="-1033.55" font-family="Times Roman,serif" font-size="20.50">bufio.(*Writer).ReadFrom</text>
<text text-anchor="end" x="1318.5" y="-1008.55" font-family="Times Roman,serif" font-size="20.50">12254 (6.2%)</text>
</g>
<!-- N6&#45;&gt;N15 -->
<g id="edge134" class="edge"><title>N6&#45;&gt;N15</title>
<path fill="none" stroke="black" d="M1373.83,-1283.76C1370.87,-1283.16 1367.92,-1282.57 1365,-1282 1284.76,-1266.26 1054.41,-1289.92 1001,-1228 973.132,-1195.69 979.363,-1168.77 1001,-1132 1019.97,-1099.77 1052.8,-1076.72 1085.83,-1060.59"/>
<polygon fill="black" stroke="black" points="1087.57,-1063.64 1095.14,-1056.22 1084.6,-1057.3 1087.57,-1063.64"/>
<text text-anchor="middle" x="1019.5" y="-1176.4" font-family="Times Roman,serif" font-size="14.00">1070</text>
</g>
<!-- N18 -->
<g id="node19" class="node"><title>N18</title>
<polygon fill="none" stroke="black" points="918,-1203.5 798,-1203.5 798,-1156.5 918,-1156.5 918,-1203.5"/>
<text text-anchor="middle" x="858" y="-1190.23" font-family="Times Roman,serif" font-size="10.30">runtime.cstringToGo</text>
<text text-anchor="end" x="910.5" y="-1177.23" font-family="Times Roman,serif" font-size="10.30">425 (0.2%)</text>
<text text-anchor="end" x="910.5" y="-1164.23" font-family="Times Roman,serif" font-size="10.30">of 9078 (4.6%)</text>
</g>
<!-- N6&#45;&gt;N18 -->
<g id="edge102" class="edge"><title>N6&#45;&gt;N18</title>
<path fill="none" stroke="black" d="M1373.9,-1283.31C1370.92,-1282.85 1367.95,-1282.41 1365,-1282 1313.25,-1274.75 938.218,-1293.38 895,-1264 878.177,-1252.56 868.932,-1231.64 863.89,-1213.55"/>
<polygon fill="black" stroke="black" points="867.227,-1212.46 861.44,-1203.58 860.429,-1214.13 867.227,-1212.46"/>
<text text-anchor="middle" x="913.5" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">9036</text>
</g>
<!-- N25 -->
<g id="node26" class="node"><title>N25</title>
<polygon fill="none" stroke="black" points="998,-634.5 894,-634.5 894,-587.5 998,-587.5 998,-634.5"/>
<text text-anchor="middle" x="946" y="-621.05" font-family="Times Roman,serif" font-size="10.50">runtime.catstring</text>
<text text-anchor="end" x="990" y="-608.05" font-family="Times Roman,serif" font-size="10.50">491 (0.2%)</text>
<text text-anchor="end" x="990" y="-595.05" font-family="Times Roman,serif" font-size="10.50">of 6647 (3.4%)</text>
</g>
<!-- N6&#45;&gt;N25 -->
<g id="edge22" class="edge"><title>N6&#45;&gt;N25</title>
<path fill="none" stroke="black" d="M1373.89,-1283.37C1370.91,-1282.89 1367.95,-1282.43 1365,-1282 1289.93,-1270.93 1094.92,-1291 1024,-1264 976.387,-1245.87 946,-1230.95 946,-1180 946,-1180 946,-1180 946,-770 946,-726.847 946,-677.106 946,-644.915"/>
<polygon fill="black" stroke="black" points="949.5,-644.705 946,-634.705 942.5,-644.705 949.5,-644.705"/>
<text text-anchor="middle" x="964.5" y="-945.4" font-family="Times Roman,serif" font-size="14.00">6647</text>
</g>
<!-- N27 -->
<g id="node28" class="node"><title>N27</title>
<polygon fill="none" stroke="black" points="676,-1208 450,-1208 450,-1152 676,-1152 676,-1208"/>
<text text-anchor="middle" x="563" y="-1192.66" font-family="Times Roman,serif" font-size="12.60">encoding/xml.(*Decoder).nsname</text>
<text text-anchor="end" x="668.5" y="-1176.66" font-family="Times Roman,serif" font-size="12.60">1673 (0.8%)</text>
<text text-anchor="end" x="668.5" y="-1160.66" font-family="Times Roman,serif" font-size="12.60">of 6378 (3.2%)</text>
</g>
<!-- N6&#45;&gt;N27 -->
<g id="edge70" class="edge"><title>N6&#45;&gt;N27</title>
<path fill="none" stroke="black" d="M1373.91,-1283.28C1370.92,-1282.83 1367.95,-1282.4 1365,-1282 1233.04,-1264.06 896.212,-1291.92 766,-1264 716.801,-1253.45 664.4,-1231.47 625.162,-1212.64"/>
<polygon fill="black" stroke="black" points="626.512,-1209.4 615.988,-1208.18 623.451,-1215.7 626.512,-1209.4"/>
<text text-anchor="middle" x="784.5" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">6378</text>
</g>
<!-- N29 -->
<g id="node30" class="node"><title>N29</title>
<polygon fill="none" stroke="black" points="780,-1203.5 694,-1203.5 694,-1156.5 780,-1156.5 780,-1203.5"/>
<text text-anchor="middle" x="737" y="-1190.68" font-family="Times Roman,serif" font-size="9.80">gostringsize</text>
<text text-anchor="end" x="772.5" y="-1177.68" font-family="Times Roman,serif" font-size="9.80">248 (0.1%)</text>
<text text-anchor="end" x="772.5" y="-1164.68" font-family="Times Roman,serif" font-size="9.80">of 6030 (3.1%)</text>
</g>
<!-- N6&#45;&gt;N29 -->
<g id="edge36" class="edge"><title>N6&#45;&gt;N29</title>
<path fill="none" stroke="black" d="M1373.91,-1283.3C1370.92,-1282.84 1367.95,-1282.41 1365,-1282 1306.96,-1273.99 893.354,-1283.2 838,-1264 808.706,-1253.84 782.041,-1230.78 763.474,-1211.39"/>
<polygon fill="black" stroke="black" points="765.89,-1208.85 756.521,-1203.9 760.76,-1213.61 765.89,-1208.85"/>
<text text-anchor="middle" x="856.5" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">6030</text>
</g>
<!-- N6&#45;&gt;N36 -->
<g id="edge120" class="edge"><title>N6&#45;&gt;N36</title>
<path fill="none" stroke="black" d="M1748.06,-1313.11C1879.85,-1298.22 2059.47,-1271.89 2213,-1228 2226.74,-1224.07 2241.03,-1218.91 2254.64,-1213.43"/>
<polygon fill="black" stroke="black" points="2256.03,-1216.64 2263.94,-1209.6 2253.36,-1210.17 2256.03,-1216.64"/>
<text text-anchor="middle" x="2162.5" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">3334</text>
</g>
<!-- N41 -->
<g id="node42" class="node"><title>N41</title>
<polygon fill="none" stroke="black" points="1187,-1206.5 1047,-1206.5 1047,-1153.5 1187,-1153.5 1187,-1206.5"/>
<text text-anchor="middle" x="1117" y="-1191.97" font-family="Times Roman,serif" font-size="11.70">bytes.(*Buffer).String</text>
<text text-anchor="end" x="1179.5" y="-1176.97" font-family="Times Roman,serif" font-size="11.70">1097 (0.6%)</text>
<text text-anchor="end" x="1179.5" y="-1161.97" font-family="Times Roman,serif" font-size="11.70">of 2731 (1.4%)</text>
</g>
<!-- N6&#45;&gt;N41 -->
<g id="edge140" class="edge"><title>N6&#45;&gt;N41</title>
<path fill="none" stroke="black" d="M1373.63,-1282.62C1301.91,-1263.45 1229.35,-1242.47 1196,-1228 1185.52,-1223.46 1174.77,-1217.73 1164.7,-1211.83"/>
<polygon fill="black" stroke="black" points="1166.42,-1208.78 1156.05,-1206.62 1162.81,-1214.78 1166.42,-1208.78"/>
<text text-anchor="middle" x="1318.5" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">2731</text>
</g>
<!-- N51 -->
<g id="node52" class="node"><title>N51</title>
<polygon fill="none" stroke="black" points="1713,-1203.5 1625,-1203.5 1625,-1156.5 1713,-1156.5 1713,-1203.5"/>
<text text-anchor="middle" x="1669" y="-1190.77" font-family="Times Roman,serif" font-size="9.70">strings.explode</text>
<text text-anchor="end" x="1705.5" y="-1177.77" font-family="Times Roman,serif" font-size="9.70">224 (0.1%)</text>
<text text-anchor="end" x="1705.5" y="-1164.77" font-family="Times Roman,serif" font-size="9.70">of 1148 (0.6%)</text>
</g>
<!-- N6&#45;&gt;N51 -->
<g id="edge110" class="edge"><title>N6&#45;&gt;N51</title>
<path fill="none" stroke="black" d="M1595.47,-1282.13C1612,-1259.17 1631.35,-1232.29 1646.05,-1211.88"/>
<polygon fill="black" stroke="black" points="1649.04,-1213.71 1652.04,-1203.55 1643.36,-1209.62 1649.04,-1213.71"/>
<text text-anchor="middle" x="1640.5" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">1148</text>
</g>
<!-- N53 -->
<g id="node54" class="node"><title>N53</title>
<polygon fill="none" stroke="black" points="1871,-1205 1731,-1205 1731,-1155 1871,-1155 1871,-1205"/>
<text text-anchor="middle" x="1801" y="-1191.28" font-family="Times Roman,serif" font-size="10.80">runtime.gostringnocopy</text>
<text text-anchor="end" x="1863" y="-1177.28" font-family="Times Roman,serif" font-size="10.80">610 (0.3%)</text>
<text text-anchor="end" x="1863" y="-1163.28" font-family="Times Roman,serif" font-size="10.80">of 1053 (0.5%)</text>
</g>
<!-- N6&#45;&gt;N53 -->
<g id="edge146" class="edge"><title>N6&#45;&gt;N53</title>
<path fill="none" stroke="black" d="M1637.27,-1282.33C1674.94,-1258.79 1719.28,-1231.08 1752.3,-1210.44"/>
<polygon fill="black" stroke="black" points="1754.25,-1213.35 1760.87,-1205.08 1750.54,-1207.41 1754.25,-1213.35"/>
<text text-anchor="middle" x="1714.5" y="-1251.4" font-family="Times Roman,serif" font-size="14.00">1049</text>
</g>
<!-- N7&#45;&gt;N6 -->
<g id="edge90" class="edge"><title>N7&#45;&gt;N6</title>
<path fill="none" stroke="black" d="M1937.82,-1038.26C1791.11,-1050.75 1618.29,-1077 1570,-1132 1536.93,-1169.66 1538.58,-1228.57 1546.14,-1272.35"/>
<polygon fill="black" stroke="black" points="1542.72,-1273.1 1548.01,-1282.28 1549.6,-1271.81 1542.72,-1273.1"/>
<text text-anchor="middle" x="1593" y="-1176.4" font-family="Times Roman,serif" font-size="14.00">21338</text>
</g>
<!-- N7&#45;&gt;N7 -->
<g id="edge30" class="edge"><title>N7&#45;&gt;N7</title>
<path fill="none" stroke="black" d="M2388.31,-1036.4C2399.44,-1034.06 2406,-1030.92 2406,-1027 2406,-1024.43 2403.18,-1022.19 2398.09,-1020.3"/>
<polygon fill="black" stroke="black" points="2398.88,-1016.88 2388.31,-1017.6 2397.02,-1023.63 2398.88,-1016.88"/>
<text text-anchor="middle" x="2429" y="-1023.4" font-family="Times Roman,serif" font-size="14.00">14987</text>
</g>
<!-- N19 -->
<g id="node20" class="node"><title>N19</title>
<polygon fill="none" stroke="black" points="2056,-911 1834,-911 1834,-859 2056,-859 2056,-911"/>
<text text-anchor="middle" x="1945" y="-890.8" font-family="Times Roman,serif" font-size="18.00">bufio.(*Reader).readErr</text>
<text text-anchor="end" x="2048.5" y="-868.8" font-family="Times Roman,serif" font-size="18.00">7959 (4.0%)</text>
</g>
<!-- N7&#45;&gt;N19 -->
<g id="edge44" class="edge"><title>N7&#45;&gt;N19</title>
<path fill="none" stroke="black" d="M2085.22,-976.336C2054.66,-956.428 2020.52,-934.19 1993.58,-916.642"/>
<polygon fill="black" stroke="black" points="1995.39,-913.643 1985.1,-911.118 1991.57,-919.508 1995.39,-913.643"/>
<text text-anchor="middle" x="2072.5" y="-945.4" font-family="Times Roman,serif" font-size="14.00">7959</text>
</g>
<!-- N20 -->
<g id="node21" class="node"><title>N20</title>
<polygon fill="none" stroke="black" points="2252,-922 2074,-922 2074,-848 2252,-848 2252,-922"/>
<text text-anchor="middle" x="2163" y="-901.89" font-family="Times Roman,serif" font-size="17.90">bufio.(*Reader).fill</text>
<text text-anchor="end" x="2244.5" y="-879.89" font-family="Times Roman,serif" font-size="17.90">7674 (3.9%)</text>
<text text-anchor="end" x="2244.5" y="-857.89" font-family="Times Roman,serif" font-size="17.90">of 7790 (3.9%)</text>
</g>
<!-- N7&#45;&gt;N20 -->
<g id="edge86" class="edge"><title>N7&#45;&gt;N20</title>
<path fill="none" stroke="black" d="M2163,-976.136C2163,-961.931 2163,-946.553 2163,-932.547"/>
<polygon fill="black" stroke="black" points="2166.5,-932.146 2163,-922.147 2159.5,-932.147 2166.5,-932.146"/>
<text text-anchor="middle" x="2181.5" y="-945.4" font-family="Times Roman,serif" font-size="14.00">7790</text>
</g>
<!-- N7&#45;&gt;N22 -->
<g id="edge150" class="edge"><title>N7&#45;&gt;N22</title>
<path fill="none" stroke="black" d="M2219.6,-976.136C2240.92,-956.971 2264.62,-935.673 2283.74,-918.488"/>
<polygon fill="black" stroke="black" points="2286.27,-920.923 2291.36,-911.635 2281.59,-915.716 2286.27,-920.923"/>
<text text-anchor="middle" x="2275.5" y="-945.4" font-family="Times Roman,serif" font-size="14.00">2569</text>
</g>
<!-- N42 -->
<g id="node43" class="node"><title>N42</title>
<polygon fill="none" stroke="black" points="1761,-910 1649,-910 1649,-860 1761,-860 1761,-910"/>
<text text-anchor="middle" x="1705" y="-896.37" font-family="Times Roman,serif" font-size="10.70">runtime.sighandler</text>
<text text-anchor="end" x="1753.5" y="-882.37" font-family="Times Roman,serif" font-size="10.70">585 (0.3%)</text>
<text text-anchor="end" x="1753.5" y="-868.37" font-family="Times Roman,serif" font-size="10.70">of 2698 (1.4%)</text>
</g>
<!-- N7&#45;&gt;N42 -->
<g id="edge82" class="edge"><title>N7&#45;&gt;N42</title>
<path fill="none" stroke="black" d="M1999.91,-976.436C1920.91,-951.943 1830.47,-923.902 1770.8,-905.402"/>
<polygon fill="black" stroke="black" points="1771.72,-902.022 1761.13,-902.403 1769.65,-908.708 1771.72,-902.022"/>
<text text-anchor="middle" x="1952.5" y="-945.4" font-family="Times Roman,serif" font-size="14.00">2698</text>
</g>
<!-- N8&#45;&gt;N15 -->
<g id="edge74" class="edge"><title>N8&#45;&gt;N15</title>
<path fill="none" stroke="black" d="M1310.59,-1132.43C1284.9,-1109.97 1254.74,-1083.6 1231.01,-1062.86"/>
<polygon fill="black" stroke="black" points="1233.06,-1060 1223.23,-1056.05 1228.45,-1065.27 1233.06,-1060"/>
<text text-anchor="middle" x="1311" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">10223</text>
</g>
<!-- N30 -->
<g id="node31" class="node"><title>N30</title>
<polygon fill="none" stroke="black" points="1508,-1052 1390,-1052 1390,-1002 1508,-1002 1508,-1052"/>
<text text-anchor="middle" x="1449" y="-1033.15" font-family="Times Roman,serif" font-size="16.50">bufio.init</text>
<text text-anchor="end" x="1500.5" y="-1012.15" font-family="Times Roman,serif" font-size="16.50">5761 (2.9%)</text>
</g>
<!-- N8&#45;&gt;N30 -->
<g id="edge50" class="edge"><title>N8&#45;&gt;N30</title>
<path fill="none" stroke="black" d="M1391.12,-1132.43C1403.79,-1109.35 1418.72,-1082.16 1430.24,-1061.17"/>
<polygon fill="black" stroke="black" points="1433.37,-1062.74 1435.12,-1052.29 1427.24,-1059.37 1433.37,-1062.74"/>
<text text-anchor="middle" x="1428.5" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">5458</text>
</g>
<!-- N9&#45;&gt;N7 -->
<g id="edge92" class="edge"><title>N9&#45;&gt;N7</title>
<path fill="none" stroke="black" d="M2039.74,-1148.67C2058.36,-1130.29 2082.47,-1106.49 2104.42,-1084.82"/>
<polygon fill="black" stroke="black" points="2107.12,-1087.08 2111.78,-1077.56 2102.2,-1082.1 2107.12,-1087.08"/>
<text text-anchor="middle" x="2114" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">18853</text>
</g>
<!-- N9&#45;&gt;N15 -->
<g id="edge142" class="edge"><title>N9&#45;&gt;N15</title>
<path fill="none" stroke="black" d="M1937.07,-1148.92C1918.8,-1142.17 1898.95,-1135.89 1880,-1132 1711.77,-1097.43 1661.55,-1151.73 1494,-1114 1473.79,-1109.45 1470.64,-1102.6 1451,-1096 1420.55,-1085.77 1412.07,-1086.14 1381,-1078 1357.36,-1071.81 1332.1,-1065.11 1307.95,-1058.68"/>
<polygon fill="black" stroke="black" points="1308.6,-1055.23 1298.04,-1056.03 1306.8,-1061.99 1308.6,-1055.23"/>
<text text-anchor="middle" x="1508" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">380</text>
</g>
<!-- N10 -->
<g id="node11" class="node"><title>N10</title>
<polygon fill="none" stroke="black" points="942,-476 652,-476 652,-396 942,-396 942,-476"/>
<text text-anchor="middle" x="797" y="-454.72" font-family="Times Roman,serif" font-size="19.20">vdso_init_from_sysinfo_ehdr</text>
<text text-anchor="end" x="934.5" y="-430.72" font-family="Times Roman,serif" font-size="19.20">9852 (5.0%)</text>
<text text-anchor="end" x="934.5" y="-406.72" font-family="Times Roman,serif" font-size="19.20">of 19307 (9.8%)</text>
</g>
<!-- N31 -->
<g id="node32" class="node"><title>N31</title>
<polygon fill="none" stroke="black" points="836,-339.5 758,-339.5 758,-298.5 836,-298.5 836,-339.5"/>
<text text-anchor="middle" x="797" y="-327.76" font-family="Times Roman,serif" font-size="8.60">runtime.lock</text>
<text text-anchor="end" x="828.5" y="-316.76" font-family="Times Roman,serif" font-size="8.60">24 (0.0%)</text>
<text text-anchor="end" x="828.5" y="-305.76" font-family="Times Roman,serif" font-size="8.60">of 4932 (2.5%)</text>
</g>
<!-- N10&#45;&gt;N31 -->
<g id="edge114" class="edge"><title>N10&#45;&gt;N31</title>
<path fill="none" stroke="black" d="M797,-395.735C797,-380.67 797,-363.813 797,-349.743"/>
<polygon fill="black" stroke="black" points="800.5,-349.604 797,-339.604 793.5,-349.604 800.5,-349.604"/>
<text text-anchor="middle" x="815.5" y="-365.4" font-family="Times Roman,serif" font-size="14.00">4932</text>
</g>
<!-- N34 -->
<g id="node35" class="node"><title>N34</title>
<polygon fill="none" stroke="black" points="966,-342 854,-342 854,-296 966,-296 966,-342"/>
<text text-anchor="middle" x="910" y="-323.96" font-family="Times Roman,serif" font-size="15.60">gc</text>
<text text-anchor="end" x="958.5" y="-304.96" font-family="Times Roman,serif" font-size="15.60">4524 (2.3%)</text>
</g>
<!-- N10&#45;&gt;N34 -->
<g id="edge128" class="edge"><title>N10&#45;&gt;N34</title>
<path fill="none" stroke="black" d="M835.888,-395.735C850.432,-380.677 866.706,-363.827 880.291,-349.761"/>
<polygon fill="black" stroke="black" points="883.104,-351.886 887.533,-342.262 878.069,-347.023 883.104,-351.886"/>
<text text-anchor="middle" x="889.5" y="-365.4" font-family="Times Roman,serif" font-size="14.00">4523</text>
</g>
<!-- N12 -->
<g id="node13" class="node"><title>N12</title>
<polygon fill="none" stroke="black" points="506,-1056.5 324,-1056.5 324,-997.5 506,-997.5 506,-1056.5"/>
<text text-anchor="middle" x="415" y="-1040.44" font-family="Times Roman,serif" font-size="13.40">sync.(*RWMutex).Unlock</text>
<text text-anchor="end" x="498" y="-1023.44" font-family="Times Roman,serif" font-size="13.40">2265 (1.1%)</text>
<text text-anchor="end" x="498" y="-1006.44" font-family="Times Roman,serif" font-size="13.40">of 13757 (7.0%)</text>
</g>
<!-- N11&#45;&gt;N12 -->
<g id="edge104" class="edge"><title>N11&#45;&gt;N12</title>
<path fill="none" stroke="black" d="M324.075,-1150.47C327.35,-1133.63 333.1,-1112.63 343,-1096 349.916,-1084.38 359.313,-1073.43 369.033,-1063.82"/>
<polygon fill="black" stroke="black" points="371.647,-1066.17 376.494,-1056.75 366.829,-1061.09 371.647,-1066.17"/>
<text text-anchor="middle" x="366" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">10293</text>
</g>
<!-- N13 -->
<g id="node14" class="node"><title>N13</title>
<polygon fill="none" stroke="black" points="306,-1064 1.42109e-13,-1064 0,-990 306,-990 306,-1064"/>
<text text-anchor="middle" x="153" y="-1044.61" font-family="Times Roman,serif" font-size="17.10">unicode/utf8.decodeRuneInternal</text>
<text text-anchor="end" x="298" y="-1022.61" font-family="Times Roman,serif" font-size="17.10">6515 (3.3%)</text>
<text text-anchor="end" x="298" y="-1000.61" font-family="Times Roman,serif" font-size="17.10">of 13465 (6.8%)</text>
</g>
<!-- N11&#45;&gt;N13 -->
<g id="edge132" class="edge"><title>N11&#45;&gt;N13</title>
<path fill="none" stroke="black" d="M287.404,-1150.14C262.85,-1127.64 228.799,-1096.44 201.115,-1071.08"/>
<polygon fill="black" stroke="black" points="203.226,-1068.27 193.488,-1064.09 198.498,-1073.43 203.226,-1068.27"/>
<text text-anchor="middle" x="265.5" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">4541</text>
</g>
<!-- N48 -->
<g id="node49" class="node"><title>N48</title>
<polygon fill="none" stroke="black" points="682,-1047 524,-1047 524,-1007 682,-1007 682,-1047"/>
<text text-anchor="middle" x="603" y="-1031.75" font-family="Times Roman,serif" font-size="12.50">sync.(*RWMutex).Lock</text>
<text text-anchor="end" x="674" y="-1015.75" font-family="Times Roman,serif" font-size="12.50">1606 (0.8%)</text>
</g>
<!-- N11&#45;&gt;N48 -->
<g id="edge42" class="edge"><title>N11&#45;&gt;N48</title>
<path fill="none" stroke="black" d="M381.565,-1150.39C401.214,-1139.91 422.616,-1127.37 441,-1114 450.407,-1107.16 450.007,-1101.95 460,-1096 482.096,-1082.84 491.523,-1088.51 515,-1078 531.284,-1070.71 548.421,-1061.23 563.202,-1052.43"/>
<polygon fill="black" stroke="black" points="565.33,-1055.23 572.071,-1047.06 561.704,-1049.24 565.33,-1055.23"/>
<text text-anchor="middle" x="478.5" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">1140</text>
</g>
<!-- N26 -->
<g id="node27" class="node"><title>N26</title>
<polygon fill="none" stroke="black" points="536,-911 294,-911 294,-859 536,-859 536,-911"/>
<text text-anchor="middle" x="415" y="-891.61" font-family="Times Roman,serif" font-size="17.10">sync.(*RWMutex).RUnlock</text>
<text text-anchor="end" x="528.5" y="-869.61" font-family="Times Roman,serif" font-size="17.10">6549 (3.3%)</text>
</g>
<!-- N12&#45;&gt;N26 -->
<g id="edge116" class="edge"><title>N12&#45;&gt;N26</title>
<path fill="none" stroke="black" d="M415,-997.232C415,-975.228 415,-945.139 415,-921.654"/>
<polygon fill="black" stroke="black" points="418.5,-921.381 415,-911.382 411.5,-921.382 418.5,-921.381"/>
<text text-anchor="middle" x="433.5" y="-945.4" font-family="Times Roman,serif" font-size="14.00">6549</text>
</g>
<!-- N35 -->
<g id="node36" class="node"><title>N35</title>
<polygon fill="none" stroke="black" points="762,-908 554,-908 554,-862 762,-862 762,-908"/>
<text text-anchor="middle" x="658" y="-890.14" font-family="Times Roman,serif" font-size="15.40">sync.(*RWMutex).RLock</text>
<text text-anchor="end" x="754" y="-871.14" font-family="Times Roman,serif" font-size="15.40">4293 (2.2%)</text>
</g>
<!-- N12&#45;&gt;N35 -->
<g id="edge138" class="edge"><title>N12&#45;&gt;N35</title>
<path fill="none" stroke="black" d="M465.645,-997.405C508.02,-972.643 568.069,-937.552 609.757,-913.191"/>
<polygon fill="black" stroke="black" points="611.755,-916.078 618.623,-908.011 608.223,-910.034 611.755,-916.078"/>
<text text-anchor="middle" x="577.5" y="-945.4" font-family="Times Roman,serif" font-size="14.00">4293</text>
</g>
<!-- N23 -->
<g id="node24" class="node"><title>N23</title>
<polygon fill="none" stroke="black" points="215,-911 91,-911 91,-859 215,-859 215,-911"/>
<text text-anchor="middle" x="153" y="-891.34" font-family="Times Roman,serif" font-size="17.40">unicode.init</text>
<text text-anchor="end" x="207.5" y="-869.34" font-family="Times Roman,serif" font-size="17.40">6950 (3.5%)</text>
</g>
<!-- N13&#45;&gt;N23 -->
<g id="edge126" class="edge"><title>N13&#45;&gt;N23</title>
<path fill="none" stroke="black" d="M153,-989.691C153,-968.602 153,-942.351 153,-921.412"/>
<polygon fill="black" stroke="black" points="156.5,-921.304 153,-911.304 149.5,-921.304 156.5,-921.304"/>
<text text-anchor="middle" x="171.5" y="-945.4" font-family="Times Roman,serif" font-size="14.00">6950</text>
</g>
<!-- N14 -->
<g id="node15" class="node"><title>N14</title>
<polygon fill="none" stroke="black" points="868,-1056.5 726,-1056.5 726,-997.5 868,-997.5 868,-1056.5"/>
<text text-anchor="middle" x="797" y="-1040.8" font-family="Times Roman,serif" font-size="13.00">runtime.semacquire</text>
<text text-anchor="end" x="860.5" y="-1023.8" font-family="Times Roman,serif" font-size="13.00">1992 (1.0%)</text>
<text text-anchor="end" x="860.5" y="-1006.8" font-family="Times Roman,serif" font-size="13.00">of 13389 (6.8%)</text>
</g>
<!-- N14&#45;&gt;N10 -->
<g id="edge34" class="edge"><title>N14&#45;&gt;N10</title>
<path fill="none" stroke="black" d="M797,-997.355C797,-968.628 797,-923.828 797,-885 797,-885 797,-885 797,-611 797,-569.149 797,-521.668 797,-486.733"/>
<polygon fill="black" stroke="black" points="800.5,-486.314 797,-476.314 793.5,-486.314 800.5,-486.314"/>
<text text-anchor="middle" x="815.5" y="-766.4" font-family="Times Roman,serif" font-size="14.00">9281</text>
</g>
<!-- N44 -->
<g id="node45" class="node"><title>N44</title>
<polygon fill="none" stroke="black" points="1094,-465.5 960,-465.5 960,-406.5 1094,-406.5 1094,-465.5"/>
<text text-anchor="middle" x="1027" y="-449.44" font-family="Times Roman,serif" font-size="13.40">vdso_find_version</text>
<text text-anchor="end" x="1086" y="-432.44" font-family="Times Roman,serif" font-size="13.40">2320 (1.2%)</text>
<text text-anchor="end" x="1086" y="-415.44" font-family="Times Roman,serif" font-size="13.40">of 2492 (1.3%)</text>
</g>
<!-- N14&#45;&gt;N44 -->
<g id="edge28" class="edge"><title>N14&#45;&gt;N44</title>
<path fill="none" stroke="black" d="M803.236,-997.499C805.75,-985.293 808.615,-970.984 811,-958 824.347,-885.346 826.878,-867.028 838,-794 858.27,-660.901 790.137,-594.254 880,-494 901.729,-469.759 920.607,-487.662 951,-476 955.75,-474.177 960.585,-472.13 965.396,-469.95"/>
<polygon fill="black" stroke="black" points="967.038,-473.045 974.593,-465.618 964.055,-466.713 967.038,-473.045"/>
<text text-anchor="middle" x="860.5" y="-766.4" font-family="Times Roman,serif" font-size="14.00">1366</text>
</g>
<!-- N46 -->
<g id="node47" class="node"><title>N46</title>
<polygon fill="none" stroke="black" points="1250,-464 1112,-464 1112,-408 1250,-408 1250,-464"/>
<text text-anchor="middle" x="1181" y="-449.02" font-family="Times Roman,serif" font-size="12.20">vdso_parse_symbols</text>
<text text-anchor="end" x="1242.5" y="-433.02" font-family="Times Roman,serif" font-size="12.20">1384 (0.7%)</text>
<text text-anchor="end" x="1242.5" y="-417.02" font-family="Times Roman,serif" font-size="12.20">of 2024 (1.0%)</text>
</g>
<!-- N14&#45;&gt;N46 -->
<g id="edge94" class="edge"><title>N14&#45;&gt;N46</title>
<path fill="none" stroke="black" d="M820.679,-997.4C881.253,-920.712 1044.49,-707.876 1150,-512 1156.51,-499.923 1162.5,-486.182 1167.45,-473.736"/>
<polygon fill="black" stroke="black" points="1170.84,-474.678 1171.19,-464.089 1164.31,-472.151 1170.84,-474.678"/>
<text text-anchor="middle" x="1019" y="-766.4" font-family="Times Roman,serif" font-size="14.00">750</text>
</g>
<!-- N15&#45;&gt;N15 -->
<g id="edge56" class="edge"><title>N15&#45;&gt;N15</title>
<path fill="none" stroke="black" d="M1326.17,-1038.19C1337.18,-1035.76 1344,-1032.03 1344,-1027 1344,-1023.7 1341.06,-1020.96 1335.93,-1018.78"/>
<polygon fill="black" stroke="black" points="1336.75,-1015.37 1326.17,-1015.81 1334.71,-1022.07 1336.75,-1015.37"/>
<text text-anchor="middle" x="1358" y="-1023.4" font-family="Times Roman,serif" font-size="14.00">588</text>
</g>
<!-- N16&#45;&gt;N13 -->
<g id="edge122" class="edge"><title>N16&#45;&gt;N13</title>
<path fill="none" stroke="black" d="M1135.77,-1327.7C873.261,-1321.11 227.968,-1297.89 162,-1228 123.772,-1187.5 129.671,-1119.48 139.56,-1073.93"/>
<polygon fill="black" stroke="black" points="143.012,-1074.53 141.854,-1064 136.192,-1072.96 143.012,-1074.53"/>
<text text-anchor="middle" x="180.5" y="-1176.4" font-family="Times Roman,serif" font-size="14.00">8149</text>
</g>
<!-- N17 -->
<g id="node18" class="node"><title>N17</title>
<polygon fill="none" stroke="black" points="2285,-2048 2191,-2048 2191,-2010 2285,-2010 2285,-2048"/>
<text text-anchor="middle" x="2238" y="-2036.8" font-family="Times Roman,serif" font-size="8.00">runtime.newproc1</text>
<text text-anchor="end" x="2277" y="-2026.8" font-family="Times Roman,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="2277" y="-2016.8" font-family="Times Roman,serif" font-size="8.00">of 9654 (4.9%)</text>
</g>
<!-- N38 -->
<g id="node39" class="node"><title>N38</title>
<polygon fill="none" stroke="black" points="2168,-1893 2064,-1893 2064,-1849 2168,-1849 2168,-1893"/>
<text text-anchor="middle" x="2116" y="-1876.04" font-family="Times Roman,serif" font-size="14.40">addfinroots</text>
<text text-anchor="end" x="2160" y="-1858.04" font-family="Times Roman,serif" font-size="14.40">3259 (1.7%)</text>
</g>
<!-- N17&#45;&gt;N38 -->
<g id="edge16" class="edge"><title>N17&#45;&gt;N38</title>
<path fill="none" stroke="black" d="M2223.28,-2009.94C2202.46,-1982.97 2164.17,-1933.38 2139.41,-1901.32"/>
<polygon fill="black" stroke="black" points="2142,-1898.95 2133.12,-1893.17 2136.46,-1903.23 2142,-1898.95"/>
<text text-anchor="middle" x="2181.5" y="-1921.4" font-family="Times Roman,serif" font-size="14.00">3259</text>
</g>
<!-- N40 -->
<g id="node41" class="node"><title>N40</title>
<polygon fill="none" stroke="black" points="2290,-1893 2186,-1893 2186,-1849 2290,-1849 2290,-1893"/>
<text text-anchor="middle" x="2238" y="-1876.4" font-family="Times Roman,serif" font-size="14.00">addroots</text>
<text text-anchor="end" x="2282" y="-1858.4" font-family="Times Roman,serif" font-size="14.00">2831 (1.4%)</text>
</g>
<!-- N17&#45;&gt;N40 -->
<g id="edge106" class="edge"><title>N17&#45;&gt;N40</title>
<path fill="none" stroke="black" d="M2238,-2009.94C2238,-1983.54 2238,-1935.48 2238,-1903.39"/>
<polygon fill="black" stroke="black" points="2241.5,-1903.17 2238,-1893.17 2234.5,-1903.17 2241.5,-1903.17"/>
<text text-anchor="middle" x="2256.5" y="-1921.4" font-family="Times Roman,serif" font-size="14.00">2831</text>
</g>
<!-- N49 -->
<g id="node50" class="node"><title>N49</title>
<polygon fill="none" stroke="black" points="2464,-1897.5 2308,-1897.5 2308,-1844.5 2464,-1844.5 2464,-1897.5"/>
<text text-anchor="middle" x="2386" y="-1882.7" font-family="Times Roman,serif" font-size="12.00">syscall.(*Errno).Timeout</text>
<text text-anchor="end" x="2456" y="-1867.7" font-family="Times Roman,serif" font-size="12.00">1277 (0.6%)</text>
<text text-anchor="end" x="2456" y="-1852.7" font-family="Times Roman,serif" font-size="12.00">of 1324 (0.7%)</text>
</g>
<!-- N17&#45;&gt;N49 -->
<g id="edge98" class="edge"><title>N17&#45;&gt;N49</title>
<path fill="none" stroke="black" d="M2255.85,-2009.94C2280.12,-1984.03 2323.94,-1937.25 2353.98,-1905.19"/>
<polygon fill="black" stroke="black" points="2356.64,-1907.47 2360.92,-1897.78 2351.53,-1902.68 2356.64,-1907.47"/>
<text text-anchor="middle" x="2361.5" y="-1921.4" font-family="Times Roman,serif" font-size="14.00">1276</text>
</g>
<!-- N18&#45;&gt;N14 -->
<g id="edge24" class="edge"><title>N18&#45;&gt;N14</title>
<path fill="none" stroke="black" d="M848.602,-1156.43C838.994,-1132.33 823.906,-1094.48 812.521,-1065.93"/>
<polygon fill="black" stroke="black" points="815.77,-1064.63 808.816,-1056.64 809.268,-1067.22 815.77,-1064.63"/>
<text text-anchor="middle" x="850.5" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">7607</text>
</g>
<!-- N21 -->
<g id="node22" class="node"><title>N21</title>
<polygon fill="none" stroke="black" points="1603,-636 1469,-636 1469,-586 1603,-586 1603,-636"/>
<text text-anchor="middle" x="1536" y="-622.28" font-family="Times Roman,serif" font-size="10.80">runtime.persistentalloc</text>
<text text-anchor="end" x="1595.5" y="-608.28" font-family="Times Roman,serif" font-size="10.80">600 (0.3%)</text>
<text text-anchor="end" x="1595.5" y="-594.28" font-family="Times Roman,serif" font-size="10.80">of 7640 (3.9%)</text>
</g>
<!-- N21&#45;&gt;N10 -->
<g id="edge60" class="edge"><title>N21&#45;&gt;N10</title>
<path fill="none" stroke="black" d="M1468.73,-608.447C1365.8,-602.353 1164.99,-581.732 1011,-512 999.175,-506.645 999.517,-499.988 988,-494 976.484,-488.013 964.249,-482.536 951.753,-477.549"/>
<polygon fill="black" stroke="black" points="952.743,-474.179 942.153,-473.83 950.214,-480.706 952.743,-474.179"/>
<text text-anchor="middle" x="1029.5" y="-499.4" font-family="Times Roman,serif" font-size="14.00">5309</text>
</g>
<!-- N21&#45;&gt;N44 -->
<g id="edge76" class="edge"><title>N21&#45;&gt;N44</title>
<path fill="none" stroke="black" d="M1468.64,-594.095C1382.33,-571.509 1228.82,-528.213 1103,-476 1098.58,-474.168 1094.08,-472.167 1089.59,-470.068"/>
<polygon fill="black" stroke="black" points="1090.92,-466.826 1080.39,-465.647 1087.89,-473.135 1090.92,-466.826"/>
<text text-anchor="middle" x="1210" y="-499.4" font-family="Times Roman,serif" font-size="14.00">540</text>
</g>
<!-- N21&#45;&gt;N46 -->
<g id="edge58" class="edge"><title>N21&#45;&gt;N46</title>
<path fill="none" stroke="black" d="M1485.14,-585.927C1422.48,-555.038 1315.89,-502.494 1246.98,-468.527"/>
<polygon fill="black" stroke="black" points="1248.45,-465.35 1237.94,-464.067 1245.36,-471.628 1248.45,-465.35"/>
<text text-anchor="middle" x="1345.5" y="-499.4" font-family="Times Roman,serif" font-size="14.00">1037</text>
</g>
<!-- N28 -->
<g id="node29" class="node"><title>N28</title>
<polygon fill="none" stroke="black" points="2373,-793.5 2269,-793.5 2269,-746.5 2373,-746.5 2373,-793.5"/>
<text text-anchor="middle" x="2321" y="-780.14" font-family="Times Roman,serif" font-size="10.40">runtime.mapiter2</text>
<text text-anchor="end" x="2365.5" y="-767.14" font-family="Times Roman,serif" font-size="10.40">451 (0.2%)</text>
<text text-anchor="end" x="2365.5" y="-754.14" font-family="Times Roman,serif" font-size="10.40">of 6238 (3.2%)</text>
</g>
<!-- N22&#45;&gt;N28 -->
<g id="edge80" class="edge"><title>N22&#45;&gt;N28</title>
<path fill="none" stroke="black" d="M2321,-858.328C2321,-842.173 2321,-821.409 2321,-804.073"/>
<polygon fill="black" stroke="black" points="2324.5,-803.793 2321,-793.793 2317.5,-803.793 2324.5,-803.793"/>
<text text-anchor="middle" x="2339.5" y="-817.4" font-family="Times Roman,serif" font-size="14.00">6173</text>
</g>
<!-- N25&#45;&gt;N10 -->
<g id="edge64" class="edge"><title>N25&#45;&gt;N10</title>
<path fill="none" stroke="black" d="M925.905,-587.399C903.476,-561.055 866.58,-517.722 837.996,-484.15"/>
<polygon fill="black" stroke="black" points="840.441,-481.622 831.293,-476.277 835.111,-486.16 840.441,-481.622"/>
<text text-anchor="middle" x="877.5" y="-499.4" font-family="Times Roman,serif" font-size="14.00">4641</text>
</g>
<!-- N25&#45;&gt;N44 -->
<g id="edge154" class="edge"><title>N25&#45;&gt;N44</title>
<path fill="none" stroke="black" d="M943.989,-587.099C942.979,-562.348 944.456,-523.27 960,-494 964.045,-486.382 969.532,-479.32 975.635,-472.934"/>
<polygon fill="black" stroke="black" points="978.293,-475.232 983.033,-465.756 973.419,-470.208 978.293,-475.232"/>
<text text-anchor="middle" x="974" y="-499.4" font-family="Times Roman,serif" font-size="14.00">583</text>
</g>
<!-- N25&#45;&gt;N46 -->
<g id="edge66" class="edge"><title>N25&#45;&gt;N46</title>
<path fill="none" stroke="black" d="M969.775,-587.295C999.758,-557.661 1049.93,-509 1071,-494 1075.69,-490.657 1095.61,-480.011 1117.24,-468.736"/>
<polygon fill="black" stroke="black" points="1118.98,-471.775 1126.24,-464.057 1115.75,-465.564 1118.98,-471.775"/>
<text text-anchor="middle" x="1085" y="-499.4" font-family="Times Roman,serif" font-size="14.00">237</text>
</g>
<!-- N27&#45;&gt;N12 -->
<g id="edge26" class="edge"><title>N27&#45;&gt;N12</title>
<path fill="none" stroke="black" d="M544.854,-1151.72C533.298,-1134.72 517.448,-1113.12 501,-1096 489.905,-1084.45 476.876,-1073.08 464.362,-1063"/>
<polygon fill="black" stroke="black" points="466.253,-1060.04 456.238,-1056.58 461.912,-1065.53 466.253,-1060.04"/>
<text text-anchor="middle" x="535.5" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">3464</text>
</g>
<!-- N27&#45;&gt;N13 -->
<g id="edge162" class="edge"><title>N27&#45;&gt;N13</title>
<path fill="none" stroke="black" d="M491.241,-1151.87C458.461,-1138.49 423.704,-1123.4 409,-1114 398.925,-1107.56 399.576,-1101.58 389,-1096 359.067,-1080.2 347.605,-1087.09 315,-1078 302.665,-1074.56 289.852,-1070.82 277.079,-1066.98"/>
<polygon fill="black" stroke="black" points="277.914,-1063.58 267.328,-1064.03 275.885,-1070.28 277.914,-1063.58"/>
<text text-anchor="middle" x="423" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">775</text>
</g>
<!-- N27&#45;&gt;N48 -->
<g id="edge166" class="edge"><title>N27&#45;&gt;N48</title>
<path fill="none" stroke="black" d="M570.337,-1151.94C577.376,-1125.01 587.972,-1084.48 595.172,-1056.94"/>
<polygon fill="black" stroke="black" points="598.607,-1057.64 597.75,-1047.08 591.835,-1055.87 598.607,-1057.64"/>
<text text-anchor="middle" x="599" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">466</text>
</g>
<!-- N28&#45;&gt;N21 -->
<g id="edge130" class="edge"><title>N28&#45;&gt;N21</title>
<path fill="none" stroke="black" d="M2268.89,-759.444C2133.93,-732.11 1772.52,-658.906 1613.22,-626.641"/>
<polygon fill="black" stroke="black" points="1613.52,-623.131 1603.03,-624.576 1612.13,-629.992 1613.52,-623.131"/>
<text text-anchor="middle" x="2129.5" y="-715.4" font-family="Times Roman,serif" font-size="14.00">4540</text>
</g>
<!-- N52 -->
<g id="node53" class="node"><title>N52</title>
<polygon fill="none" stroke="black" points="2373,-692 2269,-692 2269,-530 2373,-530 2373,-692"/>
<text text-anchor="middle" x="2321" y="-678.37" font-family="Times Roman,serif" font-size="10.70">type..hash.struct</text>
<text text-anchor="middle" x="2321" y="-664.37" font-family="Times Roman,serif" font-size="10.70">{</text>
<text text-anchor="middle" x="2321" y="-650.37" font-family="Times Roman,serif" font-size="10.70">Size</text>
<text text-anchor="middle" x="2321" y="-636.37" font-family="Times Roman,serif" font-size="10.70">uint32;</text>
<text text-anchor="middle" x="2321" y="-622.37" font-family="Times Roman,serif" font-size="10.70">Mallocs</text>
<text text-anchor="middle" x="2321" y="-608.37" font-family="Times Roman,serif" font-size="10.70">uint64;</text>
<text text-anchor="middle" x="2321" y="-594.37" font-family="Times Roman,serif" font-size="10.70">Frees</text>
<text text-anchor="middle" x="2321" y="-580.37" font-family="Times Roman,serif" font-size="10.70">uint64</text>
<text text-anchor="middle" x="2321" y="-566.37" font-family="Times Roman,serif" font-size="10.70">}</text>
<text text-anchor="end" x="2365" y="-552.37" font-family="Times Roman,serif" font-size="10.70">573 (0.3%)</text>
<text text-anchor="end" x="2365" y="-538.37" font-family="Times Roman,serif" font-size="10.70">of 1084 (0.5%)</text>
</g>
<!-- N28&#45;&gt;N52 -->
<g id="edge158" class="edge"><title>N28&#45;&gt;N52</title>
<path fill="none" stroke="black" d="M2321,-746.196C2321,-734.072 2321,-718.474 2321,-702.208"/>
<polygon fill="black" stroke="black" points="2324.5,-702.018 2321,-692.018 2317.5,-702.018 2324.5,-702.018"/>
<text text-anchor="middle" x="2335" y="-715.4" font-family="Times Roman,serif" font-size="14.00">839</text>
</g>
<!-- N29&#45;&gt;N14 -->
<g id="edge152" class="edge"><title>N29&#45;&gt;N14</title>
<path fill="none" stroke="black" d="M746.244,-1156.43C755.653,-1132.43 770.406,-1094.81 781.587,-1066.3"/>
<polygon fill="black" stroke="black" points="784.986,-1067.22 785.378,-1056.64 778.469,-1064.67 784.986,-1067.22"/>
<text text-anchor="middle" x="787.5" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">5782</text>
</g>
<!-- N32 -->
<g id="node33" class="node"><title>N32</title>
<polygon fill="none" stroke="black" points="844,-241.5 750,-241.5 750,-200.5 844,-200.5 844,-241.5"/>
<text text-anchor="middle" x="797" y="-229.85" font-family="Times Roman,serif" font-size="8.50">runtime.notesleep</text>
<text text-anchor="end" x="836.5" y="-218.85" font-family="Times Roman,serif" font-size="8.50">16 (0.0%)</text>
<text text-anchor="end" x="836.5" y="-207.85" font-family="Times Roman,serif" font-size="8.50">of 4728 (2.4%)</text>
</g>
<!-- N31&#45;&gt;N32 -->
<g id="edge18" class="edge"><title>N31&#45;&gt;N32</title>
<path fill="none" stroke="black" d="M797,-298.217C797,-284.834 797,-267.192 797,-252.149"/>
<polygon fill="black" stroke="black" points="800.5,-251.753 797,-241.753 793.5,-251.753 800.5,-251.753"/>
<text text-anchor="middle" x="815.5" y="-265.4" font-family="Times Roman,serif" font-size="14.00">4728</text>
</g>
<!-- N33 -->
<g id="node34" class="node"><title>N33</title>
<polygon fill="none" stroke="black" points="877,-146 717,-146 717,-96 877,-96 877,-146"/>
<text text-anchor="middle" x="797" y="-132.19" font-family="Times Roman,serif" font-size="10.90">runtime.MCentral_AllocList</text>
<text text-anchor="end" x="869.5" y="-118.19" font-family="Times Roman,serif" font-size="10.90">680 (0.3%)</text>
<text text-anchor="end" x="869.5" y="-104.19" font-family="Times Roman,serif" font-size="10.90">of 4526 (2.3%)</text>
</g>
<!-- N32&#45;&gt;N33 -->
<g id="edge100" class="edge"><title>N32&#45;&gt;N33</title>
<path fill="none" stroke="black" d="M797,-200.28C797,-187.666 797,-171.214 797,-156.569"/>
<polygon fill="black" stroke="black" points="800.5,-156.305 797,-146.305 793.5,-156.305 800.5,-156.305"/>
<text text-anchor="middle" x="815.5" y="-169.4" font-family="Times Roman,serif" font-size="14.00">4526</text>
</g>
<!-- N43 -->
<g id="node44" class="node"><title>N43</title>
<polygon fill="none" stroke="black" points="846,-42 748,-42 748,-2.13163e-14 846,-7.10543e-15 846,-42"/>
<text text-anchor="middle" x="797" y="-25.76" font-family="Times Roman,serif" font-size="13.60">runfinq</text>
<text text-anchor="end" x="838" y="-8.76" font-family="Times Roman,serif" font-size="13.60">2509 (1.3%)</text>
</g>
<!-- N33&#45;&gt;N43 -->
<g id="edge84" class="edge"><title>N33&#45;&gt;N43</title>
<path fill="none" stroke="black" d="M797,-95.7658C797,-82.5792 797,-66.318 797,-52.3321"/>
<polygon fill="black" stroke="black" points="800.5,-52.1692 797,-42.1692 793.5,-52.1693 800.5,-52.1692"/>
<text text-anchor="middle" x="815.5" y="-65.4" font-family="Times Roman,serif" font-size="14.00">2418</text>
</g>
<!-- N50 -->
<g id="node51" class="node"><title>N50</title>
<polygon fill="none" stroke="black" points="992,-41.5 864,-41.5 864,-0.5 992,-0.5 992,-41.5"/>
<text text-anchor="middle" x="928" y="-29.67" font-family="Times Roman,serif" font-size="8.70">runtime.setblockspecial</text>
<text text-anchor="end" x="984" y="-18.67" font-family="Times Roman,serif" font-size="8.70">44 (0.0%)</text>
<text text-anchor="end" x="984" y="-7.67" font-family="Times Roman,serif" font-size="8.70">of 1310 (0.7%)</text>
</g>
<!-- N33&#45;&gt;N50 -->
<g id="edge136" class="edge"><title>N33&#45;&gt;N50</title>
<path fill="none" stroke="black" d="M830.057,-95.7658C849.29,-81.0839 873.516,-62.5905 893.062,-47.6699"/>
<polygon fill="black" stroke="black" points="895.3,-50.3654 901.125,-41.5156 891.052,-44.8013 895.3,-50.3654"/>
<text text-anchor="middle" x="893.5" y="-65.4" font-family="Times Roman,serif" font-size="14.00">1310</text>
</g>
<!-- N37&#45;&gt;N7 -->
<g id="edge40" class="edge"><title>N37&#45;&gt;N7</title>
<path fill="none" stroke="black" d="M2624.51,-1156.21C2604.01,-1136.9 2572.52,-1110.56 2540,-1096 2512.6,-1083.73 2457.69,-1071.54 2398.05,-1060.89"/>
<polygon fill="black" stroke="black" points="2398.51,-1057.42 2388.05,-1059.13 2397.29,-1064.32 2398.51,-1057.42"/>
<text text-anchor="middle" x="2584" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">725</text>
</g>
<!-- N37&#45;&gt;N22 -->
<g id="edge148" class="edge"><title>N37&#45;&gt;N22</title>
<path fill="none" stroke="black" d="M2637.97,-1156.5C2629.78,-1138.82 2617.12,-1114.57 2602,-1096 2538.58,-1018.11 2440.5,-953.125 2378.58,-916.67"/>
<polygon fill="black" stroke="black" points="2380.11,-913.515 2369.71,-911.5 2376.59,-919.562 2380.11,-913.515"/>
<text text-anchor="middle" x="2603.5" y="-1023.4" font-family="Times Roman,serif" font-size="14.00">2326</text>
</g>
<!-- N39&#45;&gt;N4 -->
<g id="edge160" class="edge"><title>N39&#45;&gt;N4</title>
<path fill="none" stroke="black" d="M1898.85,-1644.48C1914.67,-1630.62 1934.99,-1612.82 1952.7,-1597.3"/>
<polygon fill="black" stroke="black" points="1955.41,-1599.58 1960.63,-1590.36 1950.8,-1594.31 1955.41,-1599.58"/>
<text text-anchor="middle" x="1954" y="-1613.4" font-family="Times Roman,serif" font-size="14.00">458</text>
</g>
<!-- N39&#45;&gt;N21 -->
<g id="edge6" class="edge"><title>N39&#45;&gt;N21</title>
<path fill="none" stroke="black" d="M1862.81,-1644.24C1844.25,-1591.8 1809.25,-1465.36 1873,-1396 1903.79,-1362.49 2039.48,-1403.76 2077,-1378 2116.16,-1351.11 2086.01,-1310.52 2124,-1282 2151.96,-1261.01 2411.5,-1254.76 2434,-1228 2461.46,-1195.34 2463.41,-1162.91 2434,-1132 2420.16,-1117.45 2092.97,-1116.11 2073,-1114 1952.78,-1101.3 1536,-1147.89 1536,-1027 1536,-1027 1536,-1027 1536,-770 1536,-727.467 1536,-678.534 1536,-646.313"/>
<polygon fill="black" stroke="black" points="1539.5,-646.06 1536,-636.06 1532.5,-646.06 1539.5,-646.06"/>
<text text-anchor="middle" x="2474.5" y="-1176.4" font-family="Times Roman,serif" font-size="14.00">1024</text>
</g>
<!-- N41&#45;&gt;N15 -->
<g id="edge124" class="edge"><title>N41&#45;&gt;N15</title>
<path fill="none" stroke="black" d="M1116.5,-1153.15C1117.14,-1136.08 1119.76,-1113.91 1128,-1096 1133.36,-1084.34 1141.4,-1073.25 1149.92,-1063.51"/>
<polygon fill="black" stroke="black" points="1152.63,-1065.73 1156.81,-1056 1147.47,-1061 1152.63,-1065.73"/>
<text text-anchor="middle" x="1142" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">581</text>
</g>
<!-- N41&#45;&gt;N30 -->
<g id="edge2" class="edge"><title>N41&#45;&gt;N30</title>
<path fill="none" stroke="black" d="M1147.33,-1153.44C1171.12,-1134.17 1205.98,-1109.25 1241,-1096 1299.68,-1073.8 1322.87,-1101.6 1381,-1078 1392.64,-1073.27 1404.06,-1066.05 1414.12,-1058.51"/>
<polygon fill="black" stroke="black" points="1416.52,-1061.08 1422.23,-1052.15 1412.2,-1055.57 1416.52,-1061.08"/>
<text text-anchor="middle" x="1255" y="-1101.4" font-family="Times Roman,serif" font-size="14.00">303</text>
</g>
<!-- N42&#45;&gt;N42 -->
<g id="edge108" class="edge"><title>N42&#45;&gt;N42</title>
<path fill="none" stroke="black" d="M1761.15,-896.384C1771.62,-894.982 1779,-891.188 1779,-885 1779,-881.036 1775.97,-878.054 1771.04,-876.054"/>
<polygon fill="black" stroke="black" points="1771.69,-872.61 1761.15,-873.616 1770.02,-879.407 1771.69,-872.61"/>
<text text-anchor="middle" x="1797.5" y="-881.4" font-family="Times Roman,serif" font-size="14.00">2154</text>
</g>
<!-- N45 -->
<g id="node46" class="node"><title>N45</title>
<polygon fill="none" stroke="black" points="1764,-790.5 1646,-790.5 1646,-749.5 1764,-749.5 1764,-790.5"/>
<text text-anchor="middle" x="1705" y="-778.67" font-family="Times Roman,serif" font-size="8.70">runtime.settype_flush</text>
<text text-anchor="end" x="1756" y="-767.67" font-family="Times Roman,serif" font-size="8.70">42 (0.0%)</text>
<text text-anchor="end" x="1756" y="-756.67" font-family="Times Roman,serif" font-size="8.70">of 2113 (1.1%)</text>
</g>
<!-- N42&#45;&gt;N45 -->
<g id="edge168" class="edge"><title>N42&#45;&gt;N45</title>
<path fill="none" stroke="black" d="M1705,-859.763C1705,-842.408 1705,-819.256 1705,-800.811"/>
<polygon fill="black" stroke="black" points="1708.5,-800.575 1705,-790.575 1701.5,-800.575 1708.5,-800.575"/>
<text text-anchor="middle" x="1723.5" y="-817.4" font-family="Times Roman,serif" font-size="14.00">2113</text>
</g>
<!-- N45&#45;&gt;N21 -->
<g id="edge4" class="edge"><title>N45&#45;&gt;N21</title>
<path fill="none" stroke="black" d="M1682.91,-749.214C1654.21,-722.214 1603.81,-674.802 1570.17,-643.148"/>
<polygon fill="black" stroke="black" points="1572.52,-640.555 1562.84,-636.252 1567.72,-645.653 1572.52,-640.555"/>
<text text-anchor="middle" x="1678.5" y="-715.4" font-family="Times Roman,serif" font-size="14.00">2071</text>
</g>
<!-- N47&#45;&gt;N22 -->
<g id="edge10" class="edge"><title>N47&#45;&gt;N22</title>
<path fill="none" stroke="black" d="M2226.26,-1664.96C2419.74,-1656.56 2896,-1629.07 2896,-1562 2896,-1562 2896,-1562 2896,-1027 2896,-922.066 2530.51,-894.193 2382.31,-887.204"/>
<polygon fill="black" stroke="black" points="2382.18,-883.694 2372.03,-886.736 2381.86,-890.687 2382.18,-883.694"/>
<text text-anchor="middle" x="2914.5" y="-1326.4" font-family="Times Roman,serif" font-size="14.00">1022</text>
</g>
</g>
</g></svg>
// example of parallel XML stream processing, using wikidata XML dump
package main
import (
"encoding/xml"
"flag"
"fmt"
"os"
"runtime/pprof"
)
type Redirect struct {
Title string `xml:"title,attr" json:"title"`
}
// A page as it occurs on Wikipedia
type Page struct {
Title string `xml:"title" json:"title"`
CanonicalTitle string `xml:"ctitle" json:"ctitle"`
Redir Redirect `xml:"redirect" json:"redirect"`
Text string `xml:"revision>text" json:"text"`
}
func main() {
cpuprofile := flag.String("cpuprofile", "", "write cpu profile to file")
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s WIKDATA-XML-FILE\n", os.Args[0])
fmt.Fprintf(os.Stderr, "Find dumps under http://dumps.wikimedia.org/wikidatawiki/\n")
flag.PrintDefaults()
}
if flag.NArg() < 1 {
flag.Usage()
os.Exit(1)
}
filename := flag.Args()[0]
handle, err := os.Open(filename)
if err != nil {
fmt.Println(err)
return
}
defer handle.Close()
decoder := xml.NewDecoder(handle)
var inElement string
var p Page
for {
// Read tokens from the XML document in a stream.
t, _ := decoder.Token()
if t == nil {
break
}
// Inspect the type of the token just read.
switch se := t.(type) {
case xml.StartElement:
// If we just read a StartElement token
inElement = se.Name.Local
// ...and its name is "page"
if inElement == "page" {
// decode a whole chunk of following XML into the
// variable p which is a Page (se above)
decoder.DecodeElement(&p, &se)
}
default:
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment