try techniques discussed in this d3 issue, but the speed is about the same, so I think I missed the point. The huge speed boost comes with the updating and not the initial creation.
forked from jrbalsano's block: D3 Scatterplot Rendering - 2
try techniques discussed in this d3 issue, but the speed is about the same, so I think I missed the point. The huge speed boost comes with the updating and not the initial creation.
forked from jrbalsano's block: D3 Scatterplot Rendering - 2
| <!doctype html> | |
| <html> | |
| <head> | |
| <script src="https://d3js.org/d3.v4.0.0-alpha.28.js"></script> | |
| </head> | |
| <script> | |
| var height = 500; | |
| var width = 960; | |
| var timer, startTime; | |
| var startTime; | |
| function showTimeSince(startTime) { | |
| var currentTime = new Date().getTime(); | |
| var runtime = currentTime - startTime; | |
| document.getElementById('timeRendering').innerHTML = runtime + 'ms'; | |
| console.log(runtime + 'ms'); | |
| } | |
| function startTimer() { | |
| stopTimer(); | |
| startTime = new Date().getTime(); | |
| timer = setInterval(function() { | |
| showTimeSince(startTime); | |
| }, 10); | |
| showTimeSince(startTime); | |
| } | |
| function stopTimer() { | |
| if (timer) { | |
| clearInterval(timer); | |
| } | |
| showTimeSince(startTime); | |
| } | |
| function drawCircles(svg, data) { | |
| startTimer(); | |
| setTimeout(function() { | |
| var circle = svg.append('circle') | |
| .style('fill','black') | |
| .style('r',3) | |
| .remove() | |
| .node(); | |
| var circleClone = function(){ | |
| return circle.cloneNode(true); | |
| }; | |
| var circles = svg.selectAll('circle').data(data); | |
| circles.exit().remove(); | |
| circles = circles.enter() | |
| .append(circleClone) | |
| .merge(circles); | |
| var getX = function(d){return d.x}; | |
| var getY = function(d){return d.y}; | |
| circles | |
| .attr('cx',getX) | |
| .attr('cy',getY); | |
| stopTimer(); | |
| }, 0); | |
| } | |
| function renderChart() { | |
| var numPoints = parseInt(document.getElementsByName('numPoints')[0].value, 10); | |
| if (isNaN(numPoints)) { | |
| return; | |
| } | |
| startTimer(); | |
| var data = []; | |
| for (var i = 0; i < numPoints; i++) { | |
| data.push({ | |
| x: Math.random() * width, | |
| y: Math.random() * height | |
| }); | |
| } | |
| var svg = d3.select('body').selectAll('svg').data([0]); | |
| svg = svg.enter().append('svg').merge(svg); | |
| svg.attr("height", height) | |
| .attr("width", width); | |
| drawCircles(svg, data); | |
| } | |
| </script> | |
| <body> | |
| <div> | |
| <form action=""> | |
| <input name="numPoints" type="text" value="10000"> | |
| <button type="button" id="render" onClick="renderChart()">Render</button> | |
| </form> | |
| Time Rendering: <span id="timeRendering"></span> | |
| </div> | |
| </body> | |
| </html> |