За последние 24 часа нас посетили 22772 программиста и 1561 робот. Сейчас ищет 901 программист ...

вопрос по оптимизации

Тема в разделе "Прочее", создана пользователем antonn, 30 мар 2008.

  1. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    ...точнее даже по архитектуре ПХП.
    есть такой код:
    Код (Text):
    1. function parse($message) {
    2.   $sm = array("text"=> "text", и еще десяток таких полей);
    3.  
    4.   foreach($sm as $key=>$sm_i) {
    5.                 $message = preg_replace($key, $sm_i, $message);
    6.         }
    7.         return $message;
    8. }
    Так вот, вопрос - ПХП при каждом вызове функции инициализирует массив или только при первом вызове в течении сеанса? Вроде бы он изнать не знает, что такое сеанс, но в тоже время хочется верить, что он не будет вести себя так глупо :)
     
  2. Clone

    Clone Guest

    Есть такое ключевое слово static. Юзай его.
     
  3. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    это не честно, меня интересует вопрос именно в данном случае :) ПХП 5 и выше :)
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
     
  5. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    вот ведь елки...
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Если он большой, передавай по ссылке, тогда он не будет копироватся в функции и не нужно будет делать return - просто перезапишешь новыми значениями исходный массив - это будет быстрее. И в данном случае лучше и в десятки раз быстрее str_replace.
     
  7. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    antonn
    используйте константу
    или
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Psih Для этого надо объяснить что такое ссылка. Для неизучавших С это проблема. Берешь грех на душу. Всех таких как ты надо запирать в отдельном разделе, где они мудохаются с лентяями, которым "помогли" и показали какие они умные. А то потом удивляетесь. отчего это все форумы засраны.


    аффтору, который чукча-нечитатель, ПРОЧЕСТЬ
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    antonn
    А ещё лучше вообще описать что требуется, а то у меня смутное подозрение что тебе не static нужно а что-то другое....
     
  10. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    PHP:
    1. <?php
    2. $REPLACEMENTS = array("text"=> "text", и еще десяток таких полей);
    3.  
    4. function parse ($message)
    5. {
    6.     global $REPLACEMENTS;
    7.  
    8.     return preg_replace (array_keys ($REPLACEMENTS), array_values ($REPLACEMENTS), $message);
    9. }
    10. ?>
     
  11. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    stas_t в посте аффтора это все равно константа.
     
  12. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    ответ на вопрос автора -- локальный массив (как и любая локальная переменная) будет создаваться заново и уничтожаться при каждом вызове функции. чтобы этого не происходило (если уж автора это так напрягает), массив надо определять глобально. если автора напрягает также и то, что массив придётся переопределять при каждом вызове скрипта, то хранить массив придётся в кеше (apc если один сервер и memcache -- если много).

    а насчёт того, насколько глупо удалять из стэка локальные переменные -- вопрос по теории программирования и у незамутнённого сознания автора, похоже, впереди ещё много открытий. мир, действительно, несовершенен, и стэк, действительно, не бесконечен...
     
  13. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    armadillo
    работающим в асме и дельфи - нет...

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

    Psih
    там регулярка, пример вообще сделан для красоты и из вежливости :)
     
  14. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    садитесь, два. Чтобы доступ к данным чужого вызова функции назвать "оптимизацией" - это кем надо быть?
     
  15. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    ух ты, а ну-ка, расскажите, за что именно "два"? я послушаю с удовольствием :)
    хотелось выпендриться? ну теперь рассказывай, чем так возбудила фраза "работающим в асме и дельфи - нет...". Ведь, конечно, что бы так всколыхнуться, нужно разбираться и в асме, и в дельфи, и в Си, и еще иметь какой то барахлящий телепатор, я послушаю с утроенной силой %)
     
  16. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    antonn
    Короче, в данном случае идиален мой вариант с приёмом параметра по ссылке. Таким образом 2 плюса:
    1). Масив не копируется, работа происходит напрямую с массивом по ссылке - экономим память (не создаётся копия масива) и изменяется исходный массив - даже return делать не надо.
    2). Вам положить на имя переменных в отличии от вариантов со static и global (камень в огород авторов этих идей - вы привязываетесь к конкретным именам переменных + надо проверять а есть ли они вообще глобально. Темболее функция может использоваться не в одном-двух местах, а во многих. Принцип чёрного ящика господа - учить матчасть, основных принципов и парадигм программирования в PHP никто не отменял).
     
  17. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    я так понимаю, что здесь полемика исключена ?
     
  18. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    блин.. пойду убьюсь %)
    еще раз скажу - мне просто было интересно, просто спортивный интерес, как поступил в данном случае ПХП (именно на низком уровне), он прокеширует после вызова этот массив или каждый раз будет вызывать его инициализацию (выделение памяти, ее заполнение, а после ретурна - освобождение). Дельфи вот кеширует, возможно Си с какими то параметрами компиляции тоже, ПХП ведь не дураки собирали, вот мне и стало интересно - а как там на самом деле :) ПРОСТО ИНТЕРЕСНО :) Конкретно для данного случая (объявление массива локально в функции), как обойти я найду способы.
     
  19. Anonymous

    Anonymous Guest

    antonn, да забей :) лучше на, пыхни!
     
  20. Clone

    Clone Guest

    Psih, каким макаром static залезет в глобальную область видимости? Мы просто создадим в конкретной функции конкретный массив регулярок, по которым будет проходиться только внутри этой функции. К чему тут ссылки - непонятно. Это только если у нас встанет задача передать в функцию какую-то локальную переменную и чтоб её не копировать, мы передадим по ссылке.
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Да.
     
  22. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Clone
    У него идёт регулярка => данные если ты не заметил, так что при каждом вызове они меняются.

    antonn
    Тут просто так скучно бывает, что цепляешься за любое более-менее интересное обсуждение. Попробуй тут с кем нить MySQL NDB Cluser пообсуждать - никто его в глаза не видел... Или Lighttpd с XCache. Первый вообще никто не юзает и хорошо если трогали, ну второй мож и юзают, но там обуждать особо нечего - всё работает.
     
  23. Clone

    Clone Guest

    Psih, ты о чём? Там массив, где ключи - регулярки, значения - строки замены. И этим массивом прогоняется какая-то строка. Возможно, ЧПУ так реализован. И этот массив постоянен на протяжении всей работы программы.
     
  24. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    antonn
    А почему бы не проверить?
    PHP:
    1.  
    2. <?php
    3. function parse($message,$a) {
    4. if($a==true)
    5.   { $sm = array("text"=> "creative", "today"=>"forever"); } Инициализируем массив и заполняем значением, если $a=true
    6.   foreach($sm as $key=>$sm_i) { $message = str_replace($key, $sm_i, $message); }
    7.   return $message;
    8. }
    9. print parse('I write the text, becouse today i have free time',true); //Вызываем функцию, передаем в $a - true
    10. echo '<br>';
    11. print parse('I write the text, becouse today i have free time',false); //Вызываем функцию, передаем в $a - false
    12. ?>
    13.  
    В первом случае, когда $a равно true, мы видим что замена сработала. Во втором случае замена не произошла, мы получили 2 ошибки, потому что массив - $sm - пустой. Значит после return он обнулился (на самом деле вообще уничтоже как функцией unset). Если бы он сохранился, то во втором случае замена бы тоже успещшно произошла.
     
  25. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    совершенно неверно. оптимизация того толка, что я имел ввиду, выполняется на низком уровне и никак синтаксически не "ловится". Просто потому, что для синтаксиса оно прозрачно и выполняется внутренними механизмами бинарника.
    к сожалению оттебажить не могу, дебагер валится сразу после запуска апача :)