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} > {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))