EntwurfRZ
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Javascript</language>
Laaaaange Funktion
<code id="58488bc4dde12">
function isPrime(number){
if (number < 2)
return false;
for (var i = number-1; i > 1; i--){
if (number % i == 0)
return false;
}
return true;
}
</code>
<run id="58488bc4ddfde">
if (isPrime(2100000053))
console.log("Primzahl: Ja");
else
console.log("Primzahl: Nein");
</run>
Blockiert den Browser, führt u.U. sogar zum Timeout
setTimeout
<code id="58488bc4dde82">
function checkPrime(num){
var outputField = document.getElementById("result");
outputField.innerText = isPrime(num) ? "Ja" : "Nein";
}
</code>
<run id="58488bc4de045" htmloutput>
setTimeout(function(){
checkPrime(2100000053);
},5000);
'<div>Primzahl: <span id="result"></span></div>'
</run>
verschiebt schon mal das Blockieren um die angegebene Zeit, führt aber u.U. auch zum Timeout
Durch andauerndes Verschieben gibt es Zeiträume dazwischen, die der Browser nutzen kann
<code id="58488bc4ddeea">
function checkPrime2(number, i){
if (number < 2)
document.getElementById("result").innerText = "Nein";
if (i == undefined)
i = number - 1;
if (i == 1)
document.getElementById("result").innerText = "Ja";
else if (number % i == 0)
document.getElementById("result").innerText = "Nein";
else
setTimeout(function() { checkPrime2(number, i-1); },0);
}
</code>
<run id="58488bc4de0a8" htmloutput>
setTimeout(function() { checkPrime2(1009); }, 0);
'<div>Primzahl: <span id="result"></span></div>'
</run>
So bleibt alles reaktiv, aber der Overhead der vielen setTimeout Aufrufe macht die Funktion deutlich langsamer.
Für solche Spezialfälle gibt es WebWorker
Test Worker
<code id="58488bc4ddf61">
var worker = function(){
function isPrime(number){
if (number < 2)
return false;
for (var i = number-1; i > 1; i--){
if (number % i == 0)
return false;
}
return true;
}
self.onmessage = function(e) {
if (isPrime(e.data))
self.postMessage('Ja');
else
self.postMessage('Nein');
};
}
</code>
<run id="58488bc4de109" htmloutput>
var code = worker.toString();
code = code.substring(13,code.length-1);
var blob = new Blob([code]);
var worker = new Worker(window.URL.createObjectURL(blob));
worker.onmessage = function(e) { document.getElementById("result").innerText = e.data; };
worker.postMessage(17);
'<div>Primzahl: <span id="result"></span></div>'
</run>