通常情况下,性能不是什么问题,因为我主要使用PHP来运行网页和小型Web应用程序。等待几秒钟的页面不是不寻常的。
然而,最近我开始尝试解决Project Euler的问题,并决定用PHP来解决它们。
无论如何,我都无法使我的代码在1分1秒之内运行(从将近3分钟优化),我感到非常尴尬,特别是考虑到Pjt Euler的大多数帖子报告的时间为1-3秒。(#7,找到第10001个质数)
我将我的代码移植到C#中,完成同样的任务只需要0.4秒。相同的算法,代码中唯一显着的区别是我在C#中使用了List来替换我在PHP中使用的数组。
虽然我确实希望C#能够胜过php,但这种差异让我怀疑存在严重的配置问题,但我不知道该去哪里找。
这种低性能的原因可能是什么?
编辑:以下是代码: 在PHP中:
/*
* Project Euler #7:
* By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
* What is the 10001st prime number?
*/
ini_set('max_execution_time', 300);
echo "start time:" . date("i:s:u") . "<br />";
function isPrime($number, $prevPrimes)
{
foreach ($prevPrimes as $key =>$prime)
{
if ($prime == 1)
{
continue;
}
elseif ($number % $prime == 0)
{
return 0;
}
}
// If we get to here, $number is prime
return $number;
}
$primes = array();
$i = 0;
$nbPrimes = 0;
while ($nbPrimes <10001)
{
$i++;
if ($i % 2 != 0)
{
$result = isPrime($i, $primes);
if ($result != 0)
{
$primes[] = $i;
$nbPrimes++;
}
}
}
echo "#$nbPrimes: $result<br>";
echo "End time:" . date("i:s:u") . "<br />";
在C#中:
public static void RunSnippet()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
List<int> primes = new List<int>();
int i = 0;
int nbPrimes = 0;
int result =0;
while (nbPrimes <10001)
{
i++;
if (i % 2 != 0)
{
result = isPrime(i, primes);
if (result != 0)
{
primes.Add(i);
nbPrimes++;
}
}
}
stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}",
stopwatch.Elapsed);
Console.WriteLine ("#" + nbPrimes + ": " + result.ToString());
}
public static int isPrime(int number, List<int> prevPrimes)
{
foreach (int prime in prevPrimes)
{
if (prime == 1)
{
continue;
}
else if (number % prime == 0)
{
return 0;
}
}
// If we get to here, number is prime
return number;
}
==
更改为===
轻微提高性能,通过将$prevPrimes
作为引用传递来大幅提高性能。http://pastebin.com/C2z7vUj5 - Hannes