javascript - How to maximize performance of an asynchronous scheduler? -


i've noticed strange technique in javascript i've used increase performance in repetitive processes paint on canvas. in future, plan use sharedbufffer or sharedcanvas when become implemented, in meantime, general idea use:

function somecontinuousprocess(intervals, delay) {    var count = 0;    var span = document.queryselector('span');      function someexpensivefunction() {      if (count >= 1e9) {        return false;      }        {        count++;      } while (count % 1e5);        span.textcontent = count;            return true;    }        function wrapper(index) {      var start = performance.now();            if (someexpensivefunction()) {        var delta = performance.now() - start;        // logic here determine new         // values `intervals` , `delay`        scheduler[index] = settimeout(          wrapper.bind(null, index),          delay        );      }    }      var scheduler = [];      function startscheduler() {      (var = 0; < intervals; i++) {        scheduler[i] = settimeout(          wrapper.bind(null, i),          delay        );      }    }      function stopscheduler() {      (var = 0; < scheduler.length; i++) {        cleartimeout(scheduler[i]);      }        scheduler = [];    }      startscheduler();  }    int.onchange = del.onchange = () => {    var intervals = parseint(int.value);    var delay     = parseint(del.value);      if (!isnan(intervals) && !isnan(delay)) {      somecontinuousprocess(intervals, delay);    }  };
<input placeholder=intervals id=int>  <input placeholder=delay id=del>  <span></span>

if mess around parameters, you'll find of course delay , intervals both make significant difference in performance. point, if set many intervals delay, performance gain turn performance drop, along rendering thread unresponsive.

my question is, possible adaptively select intervals , delay based on given someexpensivefunction? let's assume can have someexpensivefunction() return high resolution timestamp, performance.now(), how can use vary intervals , delay intelligently optimize performance?

this seems perfect opportunity use webworkers. executed in separate thread, not impact animations on main thread.

however, still required not postmessage often, or event loop in main thread chokes on sheer number of messages.

function simple() {    var span = $('#v1');    var worker = new worker('data:text/javascript;charset=utf-8,' + encodeuri($('#someexpensivefunction').text()));      worker.onmessage = progress => span.text(progress.data);    worker.onerror = x => {  debugger;    };  }    function withanim() {    var span = $('#v2');    var worker = new worker('data:text/javascript;charset=utf-8,' + encodeuri($('#someexpensivefunction').text()));      var latestmessage = 0;    worker.onmessage = progress => latestmessage = progress.data;    worker.onerror = x => {  debugger;    };      var myreq;    function step(timestamp) {  span.text(latestmessage);  if (latestmessage < 1e9)    myreq = requestanimationframe(step);    }    myreq = requestanimationframe(step);  }    simple();  withanim();
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"   type="text/javascript" charset="utf-8"></script>  <div id=v1></div>  <div id=v2></div>  <script type="text/worker" id="someexpensivefunction">  var count = 0;  var start = performance.now();  var reportpersec = 100; //change  var delay = 1000/reportpersec;  {    //some un-interrupable task    //it might useful put in settimeout(0), if want use onmessage data work on main thread  {  count++;    } while (count % 1e2);        //report progress    if (performance.now() - start > delay) {   	postmessage(count);  start = performance.now();    }  } while (count < 1e9);  postmessage(count); //make sure send 'done'  </script>

fiddle


Comments