За последние 24 часа нас посетили 186293 программиста и 1962 робота. Сейчас ищут 1184 программиста ...

Что быстрее массив или переменные?

Тема в разделе "PHP для новичков", создана пользователем romagromov, 3 фев 2018.

  1. romagromov

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

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Здравствуйте!
    В joomla глобально передаю несколько переменных.
    Сначала задаю их в шаблоне:

    PHP:
    1. $app = JFactory::getApplication();
    2. $option = $app->input->getCmd('option');
    3. $myvarname1 = 'some_calculated_value';
    4. $myvarname2 = 'some_calculated_value';
    5. $myvarname3 = 'some_calculated_value';
    6. $app->setUserState( $option . '.myvarname1' , $myvarname1);
    7. $app->setUserState( $option . '.myvarname2' , $myvarname2);
    8. $app->setUserState( $option . '.myvarname3' , $myvarname3);
    а потом принимаю их в любом месте (компоненте, модуле и т.д.)

    PHP:
    1. $app = JFactory::getApplication();
    2. $option = $app->input->getCmd('option');
    3. $myvarname1 = $app->getUserState( $option . '.myvarname1');
    4. $myvarname2 = $app->getUserState( $option . '.myvarname2');
    5. $myvarname3 = $app->getUserState( $option . '.myvarname3');
    Насколько критично, что я передаю 3 переменных отдельно в плане скорости?
    Может передавать их одним массивом будет быстрее?
    Спасибо.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Одинаково быстро. И там в оперативу записать значение, и там. Оператива быстро работает.
     
    romagromov и MouseZver нравится это.
  3. romagromov

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

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Думал, что массив легче - одна переменная с множеством значений.
    А так множество переменных с множеством значений.
    Спасибо.
     
  4. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    setUserState и getUserState в Joomla это методы работы с сессией
    это для уточнения (они могут и в базу писатся в зависимости от настроек, тогда ваш сеттер это плюс 1 запрос)
    this в шаблоне это класс Document. И это класс "одиночки" Singleton
    вы можете писать тогда так
    PHP:
    1. $this->test = 'AAAA';
    2.  
    3. // И получать где надо
    4. $doc = JFactory::getDocument();
    5. echo $doc->test; // AAAA'
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А хранятся эти "множества значений" в астрале? :)
    Раз на то пошло, то, грубо, массив, содержащий 2 значения будет весить больше, чем 4 обычные переменные. Потому что хэндлер, указатели, прочую подкапотную механику массива тоже надо хранить. Потому что за динамичность надо платить. Потому что аллокация новой памяти - это дорого. По этому массивы в PHP аллоцируют память не по запросу, а про запас. По степени двойки. Когда очередной чанк заполняется, массив просит откусить ему еще столько же памяти, сколько в нем на данный момент.

    Массивы или переменные юзать - это не вопрос скорости или затрат памяти. Это вопрос правильности. Массив - абстрактное n-размерное m-мерное хранилище. Переменная - это просто значение в памяти. У них в принципе разные задачи.
     
    romagromov и artoodetoo нравится это.
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    есть вопросы гораздо более критичные. например
    - не потеряет ли код в читабельности если там будет массив
    - не изменяешь ли ты существующий API (что повлечёт лавину изменений)
    и т.д.
    а скорость массив/не массив это фигня вопрос ) библиотеки и фреймворки накладывают такой оверхед в качестве платы за удобство, что твои три переменные это ни о чём
     
    romagromov нравится это.
  7. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    а тогда вот такой вопрос, что легче функция или переменная, т.е.
    к примеру, у меня на каждую страницу прикручивается шапка, но title для каждой страницы разный, я захотел сделать так
    внутри header
    PHP:
    1. <title><?php echo $title; ?></title>
    , а на каждой странице
    PHP:
    1. <?php $title = 'Заголовок страницы';
    2. include $_SERVER['DOCUMENT_ROOT'].'...header.php'; ?>
    или может быть сделать функцию, типа
    PHP:
    1. function title(){ echo 'Заголовок страницы';}
    Это, конечно, частный случай, но в общем и целом в более сложных манипуляциях какой практикой пользоваться лучше?
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Гладиолус.

    Не страдай фигней :)
    Как в текущей ситуации в твоем проекте правильнее, так и делай. Это даже не экономия на спичках уже. Это какая-то новая форма мании. И это говорю тебе я - человек, готовый за каждый килобайт оперативы и миллисекунду выполнения удавиться, да.

    Все должно быть в меру.
    --- Добавлено ---
    P.S.
    Функция, внутри которой выполняется echo, само собой будет чуть дороже, чем просто echo. Ну просто потому что обертка всегда дает оверхед. Другое дело, что это "дороже" исчисляется в миллионных долях секунды и в считанных байтах оперативы.
    --- Добавлено ---
    P.P.S.
    Учитывай также, что PHP7+, в отличие от 5+, иначе работает с памятью. Выше было сказано про то, что массивы в пыхе хапают память прозапас, чтобы не тратить время на аллокацию при каждом наращивании. Так вот, семерка так работает в принципе. Когда ты стартуешь скрипт, пусть в нем вооооообще ничего нет, он автоматом откусывает 2 метра оперативки. А потом откусит еще.

    Тупо вот потому, что откусить разом 2 метра оперативки прозапас - выгоднее, чем клянчить ее по чуть чуть. Оперативка дешевле процессорного времени. Вот и все.

    Так что забей на спички. Пока укладываешься в 2 метра, тебе вообще пофиг должно быть. Плюс там сейчас фиг угадаешь, какие оптимизации хреначит интерпретатор под капотом. Разрабы пыхи загоняются в этом плане, нонче, не хуже ребят из интела, пилящих свои православные компиляторы.
     
    karmay нравится это.
  9. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    читал что php с 7 версии гораздо лучше за собой убирает, а, так вот я смотрю, создаю массив - 2 метра, 100 переменных циклом 2 метра, 1000 функций, там один хер 2 метра, непонятно было. спс

    P.S.: о, нашел как вывести, в общем 400152 - 400256 - 400416 это в байтах же,
    400152 - скрипт
    400256 - скрипт + переменная $d=4;
    400416 - скрипт + функция с echo = 4;
    получается функция на 150 байт тяжелее переменной что ли
     
    #9 karmay, 6 фев 2018
    Последнее редактирование: 6 фев 2018
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я тоже удивился поначалу, когда на семерку перешел. Думал, что косяк в настройках или у меня что-то не так. Потом расследовал это дело, оказалось, что это норма и все ок. Ну...ок так ок, разрабам пыхи виднее. Учитывая, что семерка работает быстрее пятерки, и сильно, я могу простить ей 2 метра на вызов, длящийся тысячные доли секунды.