【发布时间】:2011-09-01 02:05:48
【问题描述】:
我有一个 XAMPP 安装,几乎是默认配置。
一般来说,性能不是什么大问题,因为我主要使用 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;
}
【问题讨论】:
-
@G Molvi:我认为这不属于服务器故障。 @Sylverdrag,我刚刚通过 PHP CLI 在我的 Linux 上测试了代码(PHP 版本),是的,它大约需要 30 秒,或者需要 5 秒的执行时间。将 apache 排除在等式之外可能会带来更好的时间,但我也没有运行 XAMP。就 C# 而言,它做得更快,它是一种编译语言,但余量相当大,是的,我有兴趣看看 PHP 是否可以更接近它。
-
@Sylverdrag 您可以通过将
==更改为===并主要通过将$prevPrimes作为参考 pastebin.com/C2z7vUj5 传递来略微提高性能 -
@Sylverdrag 不要提及它 - 应该有人发布它:D 啊,nvm,Brad F Jacobs 需要积分(j/k)
-
@Salman A:那更糟。从 6 秒缩短到 36 秒。
-
@Salman 我见过的基准测试将 foreach 列为表现最好的数组迭代循环。
标签: php performance xampp