PHP数学计算真的很慢

时间:2015-06-19 23:15:42

标签: 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();
    }
} 

以下是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>

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

2 个答案:

答案 0 :(得分:4)

  

这种计算速度慢的原因是什么?是因为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;
    }
}

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

答案 1 :(得分: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;
    }
}

执行时间不到一秒: 0.94304203987122

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