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>