2015-06-19 14 views
9

Also schrieb ich ein Skript, wo Sie eine Nummer eingeben können und das Programm wird die höchste Primzahl in diesem Bereich finden. Das Problem ist, dass in PHP diese Berechnung mit größeren Zahlen wirklich langsam ist, im Vergleich zu meiner JavaScript-Version, die genau dasselbe ist, aber viel schneller.PHP Mathe Berechnung wirklich langsam

//Here Is the PHP code: 
<form> 
    <input type="text" name="input"> 
</form> 

<?php 
    $input = $_GET['input']; 

    function Prime($num) 
    { 
     if($num < 2) 
      return false; 

     for ($i = 2; $i < $num; $i++) 
     { 
      if($num % $i == 0) 
       return false; 
     } 
     return true; 
    } 

    for($i = $input; $i > 0; $i--) 
    { 
     if(Prime($i)) 
      echo $i; 

     if(Prime($i)) 
      exit(); 
    } 
} 

Hier ist die JavaScript-Variante:

<html> 
    <script> 
     var input = prompt("Enter The Number"); 

     function Prime(num) { 
      for (var i = 2; i < num; i++) { 
       if(num % i == 0) { 
        return false; 
       } 
      } 
      return true; 
     } 

     for(var i = input; i > 0; i--){ 
      if(Prime(i)){ 
       document.write(i); 
      } 
      if(Prime(i)){ 
       exit(); 
       p.thisbreaksthecode(); 
      } 
     } 
    </script> 
</html> 

Für den JavaScript-Code, die höchste Primzahl in 99.999.999 dauert 1,5 Sekunden zu finden. In PHP dauert es jedoch ganze 20 Sekunden. Angesichts der Tatsache, dass die beiden Codes abgesehen von der Syntax genau identisch sind. Das sagt mir, dass etwas nicht stimmt. Was könnte der Grund für diese langsame Berechnungsgeschwindigkeit sein? Liegt es an der Funktionsweise von PHP? Wie kann ich es reparieren?

+3

Die erste Frage: Warum berechnen Sie die Primzahl zweimal? Die zweite Frage: Haben Sie über "Profiling" gelesen? – Sven

+0

Sie vergleichen verschiedene Laufzeiten und Server/Client-Programmierung. Ich denke, dass eine Art Just-in-Time-Compilation einsetzt, wenn Ihre Javascript-Engine ausgeführt wird. – collapsar

+0

dauert weniger als 2 Sekunden, um auf 3v4l.org auszuführen, wenn Sie die Primzahl nicht zweimal berechnen; und das, ohne den Code in irgendeiner Weise zu optimieren - http://3v4l.org/hdXNM/perf#tabs –

Antwort

0

Sie tun eindeutig etwas falsch in der Art, wie Sie es ausführen.

ich ausgeführt es (php -f calc.php) und es dauerte sehr wenig:

<?php 
$input = 9999999; 

function Prime($num) { 
    if($num < 2) return false; 
    for ($i = 2; $i < $num; $i++) { 
     if($num%$i==0) 
      return false; 
    } 
    return true; 
} 

$start = microtime(true); 
for($i = $input; $i > 0; $i--){ 
    if (Prime($i)){ 
     echo $i . PHP_EOL; 
     echo (microtime(true) - $start) . PHP_EOL; 
     exit; 
    } 
} 

dauert weniger als eine Sekunde auszuführen: 0,94304203987122

Nun, wenn Sie $i++ zu ++$i ändern geht bis auf: ,67830395698547 (Pre-Zuwachs ist schneller als Post-Inkrement in PHP)

+0

9999999 ist gleich 9999999, ich denke, was du meintest war 99999999 – zefram

+0

Ja, 9 mit acht Neunen – user4757174

4

Was könnte der Grund für diese langsame Berechnungsgeschwindigkeit sein? Liegt es an der Funktionsweise von PHP?

Wahrscheinlich; PHP führt (derzeit) keine JIT-Optimierungen durch, daher ist es sehr schmerzhaft, solche engen Schleifen zu laufen.

Wie kann ich es beheben?

Durch einen besseren Algorithmus Kommissionierung:

// https://en.wikipedia.org/wiki/Primality_test#PHP_implementation 
function isPrime($n) 
{ 
    if ($n <= 3) { 
     return $n > 1; 
    } else if ($n % 2 === 0 || $n % 3 === 0) { 
     return false; 
    } else { 
     for ($i = 5; $i * $i <= $n; $i += 6) { 
      if ($n % $i === 0 || $n % ($i + 2) === 0) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

Für Ihre aktuelle Eingabe läuft es 500x schneller.

+0

Wow, Algorithmus ist alles. Danke, ich habe nicht so viel Geschwindigkeit erwartet. – user4757174