所以我写了一个脚本,你可以在其中输入一个数字,程序将找到该范围内的最高素数。 问题是在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的工作方式吗?我该如何解决?
答案 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中的后增量快)