所以我写了一个脚本,你可以在其中输入一个数字,程序将找到该范围内的最高素数.问题是在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的工作方式吗?我该如何解决?
计算速度慢的原因可能是什么?是因为 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 倍。
您的运行方式显然做错了。
我执行了它(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 中的预增量比后增量更快)