所以我写了一个脚本,你可以在其中输入一个数字,程序会找到该范围内的最大质数。 问题是,在 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/