PHP数学计算真的很慢

use*_*174 9 php math

所以我写了一个脚本,你可以在其中输入一个数字,程序将找到该范围内的最高素数.问题是在PHP中,与我的JavaScript版本相比,这个计算速度非常慢,与我的JavaScript版本相比,这是完全相同但速度更快.

//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();
    }
} 
Run Code Online (Sandbox Code Playgroud)

这是JavaScript变体:

<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>
Run Code Online (Sandbox Code Playgroud)

对于JavaScript代码,在99999999中找到最高素数需要1.5秒.但是,在PHP中它需要高达20秒.考虑到除了语法之外,这两个代码完全相同.这告诉我出了什么问题.这种计算速度慢的原因是什么?是因为PHP的工作方式吗?我该如何解决?

Ja͢*_*͢ck 5

计算速度慢的原因可能是什么?是因为 PHP 的工作方式吗?

大概; PHP(目前)不进行 JIT 优化,因此运行这样的紧密循环将非常痛苦。

我该如何修复它?

通过选择更好的算法:

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于您当前的输入,它的运行速度快了 500 倍。


gal*_*hen 0

您的运行方式显然做错了。

我执行了它(php -f calc.php)并且只花了很少的时间:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

执行时间不到一秒:0.94304203987122

现在,如果您更改$i++++$i:0.67830395698547(PHP 中的预增量比后增量更快)