За последние 24 часа нас посетил 17131 программист и 1693 робота. Сейчас ищут 955 программистов ...

Производительность - передача аргумента просто и по ссылке

Тема в разделе "PHP для новичков", создана пользователем VLK, 6 июл 2014.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Когда-то, когда изучал C++, там писали, что передача аргумента в функцию по ссылке быстрее, т.к. если ее передавать не по ссылке происходит копирование, а на это тратиться время и ресурсы.

    Опустим момент, что передача по ссылке и просто передача аргумента это немного разные вещи (да-да, я в курсе что данные переданные по ссылке при редактировании изменят и оригинал т.к. указатель указывает на один и тот же адрес в памяти).

    решил тут затестить что то типа (меняя function test($val) и function test(&$val)):
    Код (PHP):
    1. $str = '..'; // текст на 10 000 символов
    2.  
    3. function test($val) {
    4.     $z = $val;
    5. }
    6.  
    7. $start = microtime(true);
    8. for ($i = 0; $i < 10000; $i++) { test($str); }
    9. $end = microtime(true);
    10.  
    11. echo $end - $start; 
    И выяснилось что если передавать по ссылке, то по времени это дольше чем просто передавать аргумент.

    потом решил решил еще затестить по выделяемой памяти и оказалось что тоже самое, со ссылкой больше, примерно такое накрутил:
    Код (PHP):
    1. $str = '';
    2. for ($i = 0; $i < 10000; $i++) { $str .= "<div>{$i}</div>"; }
    3.  
    4. function test( $s ) {
    5.     echo '<p>in function, start: ' . memory_get_usage() . '</p>';
    6.     $z = $s;
    7.     echo '<p>in function, end: ' . memory_get_usage() . '</p>';
    8. }
    9.  
    10. echo '<p>before function: ' . memory_get_usage() . '</p>';
    11. test( $str );
    12. echo '<p>after function: ' . memory_get_usage() . '</p>';
    13.  
    14. echo '<p>memory_get_peak_usage: ' . memory_get_peak_usage() . '</p>';
    результаты у меня были такие, простая передача (с копированием):
    по ссылке:
    Вопрос скорее не "как так?", а все же как более производительно передавать аргументы по ссылке или просто, а то я может что то не то натестировал.

    PS вопрос возник просто ради любопытства, ну и еще я не равнодушен к производительности.
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Re: Производительность - передача аргумента просто и по ссыл

    Для PHP я бы и не стал делать такие тесты - для того, чтобы проверить что-то подобное, надо смотреть, как это реализовано в интерпретаторе, т.е. полазить по исходникам PHP. В C++ передавать по ссылке примитивные типы тоже большого смысла нет - другое дело, объекты (кстати, в php они всегда по ссылке передаются), массивы, структуры. Думаю, для PHP тоже должно быть верно.
     
  3. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Re: Производительность - передача аргумента просто и по ссыл

    В который раз вижу что не с того конца начинаете господа.
    По моему вы как то не представляете что вы разрабатываете.
    1. Сайт это приложение написанное на одном из серверных языков программирования. В данном случае php.
    2. Та часть которая видна пользователю написанна на html js. Js используют для того что бы повысить отзывчивость приложения и снизить нагрузку на сервер. При аякс запросах не грузятся многие картинки css и т.д. что позволяет серверу оптимальнее расходовать ресурсы.

    Что из себя представляет сайт? Это скрипты которые просто тупо подключаются к базе берут данные и формируют html который и видит пользователь. Создать html по сути быстрое дело, ну если вы конечно не выполняете по ходу сверх сложных вычислений траекторий для межгалактических путешествий.

    Первым узким местом бывает в большенстве случаев база данных, так как там чаще всего можно встретить не правильную архитектуру отсутствие индексов и т.д. что приводит к анализу большого количества строк. С увеличением посещаемости сайта сайт начинает сильно тормозить. Для php вполне сойдет отсутствие не нужных циклов и не нужных действий, пряморукость разработчика и акселератор для создания байт кода что бы интерпритатор пхп при каждом чихе как минимум не проверял синтаксис скриптов а сразу приступал к их выполнению. Передаешь ты по ссылке или объектом на мой взгляд не даст никогда ощутимого прироста поэтому и заморачиваться не стоит.
     
  4. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Re: Производительность - передача аргумента просто и по ссыл

    Данные в ПХП передаются по принципу COW. Т.е. когда вы передаете аргумент - копирования не происходит, только в момент изменения.
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Re: Производительность - передача аргумента просто и по ссыл

    ну что за привычка, распространять факты из одного языка в другой. для c++ быстрее - для php медленнее(но не всегда). это совсем разные языки. и внутри работают поразному. php более высокоуровневый. и заморачиваться об этом просто ненужно. и так все оптимизировано для скорости работы.
    передавай как обычно. php сам все сделает в лучшем виде.
    тогда не трать время на эти бессмысленные тесты, а изучай внутренности zend engine. понимание особенностей работы оградит от нерационального кода.

    можно написать скрипт, где будет явная передача по ссылке - и код будет быстрее чем без нее. так что все относительно. все зависит от задачи.
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Re: Производительность - передача аргумента просто и по ссыл

    Совсем забыл ответить, спасибо за разъяснения.
     
  7. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Re: Производительность - передача аргумента просто и по ссыл

    И еще совет.

    Задумываться об оптимизации на ссылках надо тогда, когда:
    1) У тебя идеально продумана архитектура.
    2) Код пережил уже столько циклов рефакторинга, что сам факт его существования делает вселенную лучше.
    3) У тебя идеально организована БД.
    4) У тебя уже нет денег на строительство новых датацентров для горизонтального масштабирования, а свою виртуальную машину для пыха "круче-чем-у-фейсбука" ты уже лет 5 как написал.
    5) Ты уже не знаешь, куда дальше переписывать собственноручно ядро ПХП, потому что его код..см пункт 2.
    6) Ты уже даже заменил все двойные кавычки на одинарные везде, где можно.

    Вот тогда можно начинать задумываться о ссылках/значениях.
     
  8. dcc0

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

    С нами с:
    27 июн 2014
    Сообщения:
    217
    Симпатии:
    4
    Re: Производительность - передача аргумента просто и по ссыл

    Не могу согласиться. Хочу сразу привести простой пример. Я сейчас на даче, Интернет быстрый, компьютер стареньки - Celeron 3 1400mhz. Часто захожу на два форума, один навороченный, там, видимо, и ajax и куча всего- компьютер сходит с ума. Грузится все с трудом. Работать невозможно.
    Хожу на php.ru. Подозреваю, что здесь кроме самого php и немного js ничего нет. Все работает прекрасно.
    Я понимаю, что речь, конечно, не о технологиях. Но как пользователь, я вижу, что с этим форумом могу работать с другим - нет. Думаю, это объясняется тем, что разработчики позаботились об оптимизации, а заодно проработали вопрос избыточности функционала и скорости работы. Поэтому, по моему скромному мнению, In my humble opinion, как говорят англичане, имхо, об оптимизации нужно думать всегда.
    Оптимизация, безопасность, скорость, мера функционала. Без этого никуда, и думать об этом желательно заранее.
     
  9. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Re: Производительность - передача аргумента просто и по ссыл

    А при чем тут перегруженность клиента, заставляющая браузер сжирать машину, и ссылки/значения как способы передачи аргументов? Речь идет именно о них, а не об настоящей оптимизации.
     
  10. dcc0

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

    С нами с:
    27 июн 2014
    Сообщения:
    217
    Симпатии:
    4
    Re: Производительность - передача аргумента просто и по ссыл

    А такое бывает?
    Там, где автор кода видит любую возможность оптимизации, даже незначительную, лучше ее выполнить.
    Из таких незначительностей складывается сама оптимизация. А сумма условий, описанная в ваших пунктах, для 90 процентов программистов не является достижимой.
     
  11. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Re: Производительность - передача аргумента просто и по ссыл

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

    оптимизация делается всегда после релиза. т.е сначала сделай функционал. опробуй его. и если выявится плохое - оптимизируй. но опять же не везде. а именно там где самые большие тормоза.

    а оптимизация ради оптимизации - очень редко имеет смысл.
     
  12. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Re: Производительность - передача аргумента просто и по ссыл

    Именно! Теперь почитай про сарказм и поймешь всю глубину замысла, с которым был написан тот пост.