2013-06-11 3 views
-2

У меня есть меню, которое условно отображается в зависимости от языка.Будет ли много вопросов или проблем, связанных с производительностью?

Это выглядит следующим образом:

if (
$page == "page1.htm" || 
$page == "page2.htm" || 
$page == "page3.htm" || 
etc couple 100 of those 
) { 
//output menu 
} 

У меня есть несколько hunderd тех или заявлений в одном случае.

Будет ли это заметно влиять на производительность?

Меня не интересует ремонтопригодность, но только в исполнении. Мне интересно, стоит ли оптимизировать.

+5

«У меня есть несколько hunderd тех или заявлений в одном случае» --- это реальная победа – zerkms

+0

Я понимаю его беспорядок. Но стоит ли мне беспокоиться? – user1721135

+1

Да, да, да. Вероятно, вы захотите подумать о том, что вы хотите сделать. Я имею в виду действительно ... пару 100 OR? –

ответ

2

Ну, возможно, я бы лучше опубликовать свой комментарий в качестве ответа. Если вы действительно не хотите (или не может) пересмотреть свой код в данный момент:

$pages = array_fill_keys(array("page1.htm", "page2,htm", "page3.htm"), true); 
if (array_key_exists($page, $pages)) 
{ 
    //do whatever 
} 

Опять же, если вы проверяете, если клиент запрашивает существующую страницу или нет, вы могли бы рассмотреть возможность использования:

if (file_exists($page)) 
{ 
    require_once($page); 
} 

Или что-то в этом роде. Конечно, проверить переменную $page значений как /etc/httpd/httpd.conf, или все слишком много ../.. бит и болтов ... Никогда не доверяйте сети :)

+0

Подход 'array_fill_keys()'/'array_key_exists()' на самом деле значительно дороже, чем '$ cond || $ cond || ... ', особенно если сервер использует кэширование кода операции. Подход 'file_exists()' является разумным, но вы ** должны ** санировать любой ввод использования перед тем, как применить его к файловой системе, как это! 'basename()' обычно является хорошим началом. – DaveRandom

+0

@DaveRandom: не то, что я вам не верю, или что-то еще, но не могли бы вы объяснить, почему «array_key_exists» и «array_fill_keys» стоят дороже? Я понимаю, что если '$ page === 'page1.htm'' в примере OP нет ничего, что бы превзойти это, благодаря оценке короткого замыкания –

+0

' array_fill_keys() 'будет выполнять полную итерацию ввода массив для создания выходного массива (другими словами, это O (n)). Затем 'array_key_exists()' делает хэш-поиск по ключу, чтобы увидеть, существует ли он, что также может привести к столкновению хэшей, поэтому может потребоваться дальнейшая итерация внутри.Аналогичным, но более дешевым подходом будет 'in_array()', потому что это только первый шаг итерации, в коротком замыкании, аналогичный оригинальному подходу OP. Когда вы учитываете внутренние издержки обработки вызова функции и издержки памяти массива, это довольно дорого. – DaveRandom

5

Всякий раз, когда вы оказываетесь с помощью || много в if заявлении, то ваш, вероятно, лучше всего использовать in_array():

$validPages = Array("page1.htm", "page2,htm", "page3.htm"); 
if(in_array($page, $validPages)){ 
    //Output menu 
} 
+1

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

+0

Или еще лучше: '$ pages = array_fill_keys (array ('page1.htm', 'page2.htm'), true);' и 'if (array_key_exists ($ page, $ pages))' –

+0

Это по-прежнему требует сотни жестко закодированные значения. – MrCode

4

Я хотел бы использовать RegExp для этого, вы можете также изменить ваши собственные нужды:

if (preg_match("/^page[0-9]{1,3}\.htm$/", $page)){ 
    //Execute if this is a page. 
} 

на мой взгляд, лучше, чтобы создать своего рода сложных шаблонов/нескольких шаблонов проверить с ним, потому что:

  • Вероятно, позволит повысить производительность
  • будет держать ваш код чистый (что является наиболее важным)
+2

Предполагая, что 'pageX.html' - это не просто пример, а значения действительно следуют шаблону, это хорошая идея. –

+0

Это был просто пример, есть много разных страниц. некоторые с рисунком некоторые нет. – user1721135

0

Как упоминаемый F4R-20, с помощью in_array() является хорошей идеей. Кроме того, если вы уверены, что страницы будут называться page1.htm, page2.htm и т. Д., Вы можете использовать конструкцию for loop для выполнения задачи; например:

for($i=0; $i<$no_of_pages; $i++){ 
    $pages[$i] = 'page'.($i+1).'.htm'; 
} 

if(in_array($page, $pages)){ 
    //your condition here 
} 

Вы также можете сохранить страницы в столбце таблицы, чтобы выполнить запрос sql, если это необходимо.

И что касается оператора ||, он не обязательно проверяет все условия (скажем, 100). Всякий раз, когда любое условие удовлетворяет, оно останавливается и входит в тело оператора if. Итак, лучший случай: 1 условие и наихудший случай 100 условий.

+0

'new Array ($ no_of_pages);' не PHP. Кроме того, если это был жизнеспособный подход, сопоставление шаблонов для извлечения числа из строки и проверка того, что он находится в пределах диапазона, будет значительно более эффективным для такого большого количества возможных входов. 'in_array()' имеет такое же поведение оценки короткого замыкания, что и строка условий с отношением OR. Это может быть на самом деле более дорогим, чем простой подход 'if (...)' из-за внутренних служебных вызовов функции. – DaveRandom

+0

извините за это. Я знал, что in_array() имеет ту же самую оценку короткого замыкания. Я упомянул об этом только потому, что ОП, казалось, не знал об этом. – Kevin

0

я предпочитаю это вместо этих строк кода:

$page="page10.htm"; //Example data 
$match=array(); 
preg_match('/page(\d*)\.htm/', $page,$match); 
$match=$match[1]; 
switch($x) 
{ 
    case $x>1 && $x<40: 
    echo "uder 50"; 
    break; 
    case $x>40: 
    echo "upper 50"; 
    break; 
} 
+0

прокрутите вниз до ответа jari ... –

+0

добавил пример, чтобы прояснить и даже лучший шаблон, чтобы поймать все число без ограничения диапазона, не так ли? –

+0

Не совсем: 'switch ($ x) {case $ x> 1:' может произойти только в том случае, если '$ x === true', что и OP прокомментировали предложение Яри, сказав, что фрагмент был всего лишь примером, и что страницы не все следуют одной и той же схеме –

Смежные вопросы