Повышение производительности php на локальном сервере

У меня установлен 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;  
}   
9
задан Taz 29 April 2012 в 21:35
поделиться