compareButton.onclick = function() {
webWorkerValue.innerHTML = "";
webWorkerTime.innerHTML = "";
setTimeoutValue.innerHTML = "";
setTimeoutTime.innerHTML = "";
iterationCount: 400000000,
calculatePiUsingWebWorker(workerMessage);
calculatePiUsingSetTimeout(workerMessage);
function calculatePiUsingWebWorker(workerMessage) {
var workerBlob = new Blob(["(" + workerImplementation.toString() + ")()"], {
var workerInstance = new Worker(URL.createObjectURL(workerBlob));
workerInstance.onmessage = createMessageHandler(webWorkerValue, webWorkerTime);
workerInstance.postMessage(workerMessage);
function calculatePiUsingSetTimeout(workerMessage) {
var workerInstance = new workerImplementation(true);
workerInstance.postMessage = function(data) {
createMessageHandler(setTimeoutValue, setTimeoutTime)({ data: data });
workerInstance.onmessage({ data: workerMessage });
function workerImplementation(isSetTimeoutCase) {
iterationCount, splitInterval;
this.onmessage = function(e) {
iterationCount = e.data.iterationCount;
splitInterval = e.data.splitInterval;
function calculatePi(pi, startN, iterationCount, splitInterval) {
for (var n = startN; n < iterationCount; n += 4) {
pi = pi + (4 / n) - (4 / (n + 2));
if (n > startN + splitInterval) {
calculatePi(pi, n + 4, iterationCount, splitInterval);
calculatePi(pi, n + 4, iterationCount, splitInterval);
response.end = performance.now();
self.postMessage(response);
response.start = performance.now();
calculatePi(0, 1, iterationCount, splitInterval);
function createMessageHandler(valueHolder, timeHolder) {
valueHolder.innerHTML = e.data.pi;
timeHolder.innerHTML = e.data.end - e.data.start;