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?