SO Answer / Functions speeding up over time

(web worker version) Link to question in result screen

by KooiInc MeHere

HTML

<script src="http://kooiinc.github.io/JSHelpers/Helpers-min.js"></script>
<div class="solink" data-linkid="26357225"></div>

<button>Start calculations</button>

<script data-isworker="true" type="text/js-worker">
    onmessage = function (e) {
      var timeArray = [];
      for (var i = 0; i < 100; ++i) {
        var start = new Date().getTime();
        var number1, number2, number3, number4, result1, result2, result3, endresult;

        for (var e = 0; e < 50000; ++e) {

          number1 = Math.floor((Math.random() * 100) + 1);
          number2 = Math.floor((Math.random() * 100) + 7);

          result1 = ((number1 + number2 / number1 * number2) * (number3 + number2) / number1);
          result2 = ((number2 + number3 / number1 * number4) * (number3 + number1) / number4);
          result3 = ((number3 + number4 / number4 * number2) * (number2 + number3) / number2);
          endresult = ((result1 * result2 * result3) / (result1 + result2 * result3) + result1 / result2);
        }
        var time = new Date - start;
        postMessage({iteration: i});
        timeArray.push(time);
      }
      postMessage({timings: timeArray});
    }
</script>

CSS

.bar {
    background-color: green;
    height: 1.4em;
    line-height: 1.4em;
    color: white;
    padding-left: 1em;
    border-top: 2px solid #fff;
}

JavaScript

(function (d, w, undefined) {
    var ww = new Worker(getInlineJS())
       ,bttn = d.querySelector('button')
       ,print = Helpers.log2Screen
    ;
    
    bttn.addEventListener('click', start);
    
    ww.onmessage = function (e) {
        // status message during calculation
        if (e.data.iteration) {
            return print( 'iteration #<code>', e.data.iteration, '</code>', 
                          {clear: true, direct: true} );
        }
        // print result
        void( e.data && e.data.timings && print(bars(e.data.timings),{clear:true}) );
    };
    
    function bars(arr) {
        var bardiv = '<div class="bar" style="width:{0}">#{2} &gt; {1} ({0})</div>'
           ,maxval = arr.reduce( function(a, b) {
                       return b > a ? b : a;
                     } );
        arr = arr.map( function (v, i) {
            var percentage = ((v/maxval)*100).toFixed(1)+'%';
            return String.Format(bardiv, percentage, v +'ms', i+1);
        } );
        return arr.join('');
    }
    
    function start() {
        print('start working...', {clear:true, direct: true});
        ww.postMessage({start: true});
    }
    
    function getInlineJS() {
        var js = d.querySelector('[data-isworker]').textContent;
        var blob = new Blob([js], {"type": "application\/javascript"});
        return URL.createObjectURL(blob);
    }
}(document, window))