У меня установлен XAMPP с конфигурацией по умолчанию.
Не производительность Это большая проблема в целом, поскольку я использую PHP в основном для запуска веб-страниц и небольших веб-приложений. Ожидание страницы на пару секунд не является чем-то необычным.
Однако недавно я занялся проблемами из Project Euler и решил решить их на PHP.
Как я ни старался, мне не удавалось запустить мой код менее чем за 1 минуту 1 секунду (оптимизировано с почти 3 минут), и я очень смущался, особенно учитывая, что большинство плакатов на Pjt Euler сообщали о времени 1 -3 секунды. (# 7, найдите 10001-е простое число)
Я перенес свой код на C #, и та же задача была выполнена в мгновение ока. 0,4 секунды. Тот же алгоритм, единственное заметное отличие в коде состоит в том, что я использовал список в C # для замены массива, который я использовал в 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;
}