Hello, it's me again, some days ago, you helped me alot, and thank you for it ![]()
I've got problem with optimization, my script works really slow, because my for loop add graphic from 20k to 50k times, is there any way to optimize it? ![]()
There is code: [HTML] <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="te - Pastebin.com
Jędrek,
Can you share the json file for performance testing?
Here is your code optimized to use web workers (it draws in about 2 seconds):
index.html:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
<title>Create circles</title>
<link rel="stylesheet" href="http://js.arcgis.com/3.20/esri/css/esri.css">
<style>
html,
body,
#map {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
#controls {
background: #fff;
box-shadow: 0 6px 6px -6px #999;
color: #444;
font-family: sans-serif;
height: auto;
left: 1em;
padding: 1em;
position: absolute;
top: 1em;
width: auto;
z-index: 40;
}
#controls div {
padding: 0 0 1em 0;
}
</style>
<script src="http://js.arcgis.com/3.20"></script>
<script>
var map, actual_JSON, w, gLayer;
require([
"esri/map", "esri/symbols/SimpleFillSymbol", "esri/SpatialReference",
"esri/graphic", "esri/layers/GraphicsLayer", "esri/Color",
"esri/geometry/Extent", "esri/graphicsUtils", "dojo/domReady!"
], function(
Map, SimpleFillSymbol, SpatialReference,
Graphic, GraphicsLayer, Color, Extent,
graphicsUtils
) {
map = new Map("map", {
basemap: "gray",
center: [22.741, 51.39],
slider: false,
zoom: 2
});
gLayer = new GraphicsLayer({
opacity: 0.7
});
map.addLayer(gLayer);
map.on("load", function(){
if (typeof(w) == "undefined") {
w = new Worker("ProcessGraphics.js");
}
w.onmessage = function(event){
var wr = event.data;
for ( var i = 0; i < wr.ilosc; i++ ) {
r = Math.round(255 * ((wr.t[i] - wr.minimalna) / wr.licznik));
b = 255 - r;
g = new Graphic(new Extent(wr.x[i], wr.y[i], wr.x[i] + 0.1, wr.y[i] + 0.1,
new SpatialReference({wkid: 4326})),
new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, null, new Color([r,0,b,1]))
);
gLayer.add(g);
}
map.setExtent(graphicsUtils.graphicsExtent(gLayer.graphics).expand(1.2), true);
};
});
});
</script>
</head>
<body>
<div id="map"></div>
</div>
</body>
</html>ProcessGraphics.js:
var actual_JSON;
function loadJSON( file, callback ) {
var xobj = new XMLHttpRequest();
xobj.overrideMimeType( "application/json" );
xobj.open( 'GET', file, true ); // Replace 'my_data' with the path to your file
xobj.onreadystatechange = function () {
if ( xobj.readyState == 4 && xobj.status == "200" ) {
// Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode
callback( xobj.responseText );
}
};
xobj.send( null );
}
function load() {
loadJSON( "l67kq-test.json", function ( response ) {
actual_JSON = JSON.parse( response );
var x = [];
var t = [];
var y = [];
var dzielnik = 4; //zmienna zmniejszajaca ilosc punktow na mapie
var ilosc = actual_JSON.x * actual_JSON.y / dzielnik;
for ( var i = 0; i < ilosc; i++ ) { //20000->50000
y.push( actual_JSON.XLONG[i] );
x.push( actual_JSON.XLAT[i] );
t.push( actual_JSON.T2[i] );
}
var maksymalna = Math.max.apply(null, t);
var minimalna = Math.min.apply(null, t);
var retObj = {
minimalna: minimalna,
licznik: maksymalna - minimalna,
x: x,
y: y,
t: t,
ilosc: ilosc
};
postMessage(retObj);
} );
}
load();
Jędrek,
Have you tried the code I provided using web workers?