Кто-нибудь может дать мне совет, как сделать цикл for более эффективным? - PullRequest
0 голосов
/ 20 декабря 2010

Итак, у меня есть цикл for с 36 if-запросами внутри.Любой совет по повышению эффективности?Вы можете просмотреть полный код здесь

Вот пример того, как это выглядит:

$numbers = range(1, 36);
shuffle($numbers);  
for ($m =0; $m<37; $m++){
    if ($numbers[$m] == "1"){
        $mirza[$m] = "RUTHIE";
        $mage[$m] = "3";
        $mquote[$m] = "I get to learn a lot of new things here, like sign language!";
        $link[$m] = "http://www.google.com";
    }

    if ($numbers[$m] == "2"){
        $mirza[$m] = "AIDA";
        $mage[$m] = "82";
        $mquote[$m] = "This is like a club and I know and like all the members. It's good therapy.";
        $link[$m] = "/about/";
    }

    if ($numbers[$m] == "3"){
        $mirza[$m] = "AMIRE";
        $mage[$m] = "4";
        $mquote[$m] = "I am learning how to share and make friends.";
        $link[$m] = "/about/";
    }
}

Ответы [ 5 ]

3 голосов
/ 20 декабря 2010

Изменение ваших if-ов на переключатели с соответствующими перерывами или даже в худшем случае if..elseif..etc будет означать, что не все if должны оцениваться.

2 голосов
/ 20 декабря 2010

Когда у вас есть столько данных, это действительно должно быть в базе данных (может быть, XML или стиль документа) или текстовом файле.

Тем не менее, я покажу вам способ улучшить это с помощью жесткого кодированиявсе данные в одном месте и устранение необходимости каких-либо операторов if или switch.Вы должны ОЧЕНЬ МЕНЬШЕ измениться, чтобы поменять операторы, лучше все еще жестко закодировать все данные в одном месте (ниже), лучше все же получить базу данных или текстовый файл CSV, хранящий эти значения.

$data = array( 
         array('mirza' => 'RUTHIE', 'mage' => '3', 'mquote' => 'I get to learn a lot of new things here, like sign language!', 'link' => 'http://www.google.com'),
         array(......
             );

$numbers = range(1, 36);
shuffle($numbers);  
for ($m =0; $m<37; $m++){
     $index = $numbers[$m];
     $mirza[$m] = $data[$index]['mirza'];
     $mage[$m] = $data[$index]['mage'];
     $mquote[$m] = $data[$index]['mage'];
     $link[$m] = $data[$index]['link'];
 }

Просто чтобы бытьПонятно, что проблема «эффективности» здесь не столько в скорости (хотя этот путь быстрее).Это то, что у вас есть кошмар для обслуживания и изменения.

Возможно, вам стоит серьезно пересмотреть дизайн вашего приложения, в частности сделать объект с mirza, mage, mquote, link в качестве полей.

1 голос
/ 20 декабря 2010

Полагаю, это уже так быстро, как вам может понадобиться.

Единственный способ сделать это быстрее - взглянуть на сайты, тестирующие PHP, и настроить то или иное, чтобы упростить наиболее эффективные внутренние механизмы PHP.

Поскольку внутренняя часть PHP может меняться со временем (с помощью обновлений PHP), если вы не проводите регулярный сравнительный анализ своего кода, я бы сказал, что вы ничего не получите, особенно с таким простым кодом.

Например,вы можете попытаться изменить

$numbers[$m] == "2"

на

$numbers[$m] === 2

или

$numbers[$m] === "2"

Но если вы не сравните ваш код (например, поместите его вфункционируйте и измеряйте время выполнения более 10.000 итераций) вы будете слепы к улучшениям.Внутренняя скорость PHP не всегда ведет себя так, как вы ожидаете.

(то же самое относится и к ответу, который вы получили об операторе switch. Попробуйте, но с тестом!)

1 голос
/ 20 декабря 2010

Ваша проблема в том, что вы чувствуете, что просто слишком много высказываний «если»?Попробуйте оператор switch.Говоря технически, ваш цикл максимально эффективен (используется метод оценки эффективности big-O).

0 голосов
/ 20 декабря 2010

Мой совет - попытаться работать со структурами данных и поместить все эти значения в массив того же типа, что и структура данных. Таким образом, если вам позже потребуется снова получить доступ к значениям с тем же отношением числа к значению, вам не придется переопределять все, как вы сделали здесь. Все, что вам нужно сделать, это использовать индексы массива для доступа к значениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...