PHP数学计算真的很慢

标签 php math

所以我写了一个脚本,你可以在其中输入一个数字,程序会找到该范围内的最大质数。 问题是,在 PHP 中,与我的 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 的工作方式吗?我该如何解决?

最佳答案

What could be the reason for this slow calculation speed? Is it because of the way PHP works?

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

How can I fix it?

通过选择更好的算法:

// 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 倍。

关于PHP数学计算真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948602/

相关文章:

php - CakePHP 在 SELECT 输入中选择默认值

matlab - 通过平移和旋转从一个笛卡尔 3D 坐标系更改为另一个

Java double 没有小数位不能正确相乘?

javascript - 旋转六边形上的索引

php - 出现意外的 PHP 语法错误 'foreach' (T_FOREACH)

javascript - 将 PHP 变量分配给 JavaScript 变量,值正在消失

php - 在php中重复数组日期

php - MySQL 数据库函数将其他表中的值减少 1

c - AND 按位运算的数学方程式?

java - 求2个数组长度的最大值