Решардирование - это как? Вы просто добавляете новый шард и новые данные пишутся туда? Или нужно перетрясти все шарды переместив 1/N часть данных каждого на новый? Судя по тексту вы используете первый вариант, но термин "решардирование" смутил.
Хм, отличная статья, спасибо. Для того, чтобы "одноразовые" контейнеры не копились, нужно использовать флаг --rm, не знаю был ли он у команды run в 2017-ом )
Я прошу прощения, я вас с @FanatPHPперепутал. А ожидается как минимум мной потому что в документации сказано, что by default, variables are always assigned by value. А тонкие материи там освещены так себе. Поэтому и ожидается... дефолтное поведение.
Я устал с вами с спорить. Вы не ответили на вопрос как объяснить то, что при передаче массива в функцию и по ссылке и по значению кол-во потребляемой памяти не увеличивается. Потому что ответ очевиден, но вы не хотите признать эту очевидность, потому что всегда считали, что массив передаётся по значению. И ввиду нежелания принять этот факт решили свести всё к терминологическому спору. Моя статья не про точность терминов, а про то, как работать с массивами не вызывая чрезмерного потребления памяти. И эти чёртовы массивы в PHP передаются по ссылке, указателю или ещё какому-то фантомному референсу не вызывая копирования, как это ожидается, при передаче по значению. Потому что они передаются не по значению.
Copy-on-write - это не третий и никакой вообще способ передачи. Это механизм позволяющий оттянуть или вовсе избежать копирования параметров функции. Он опционален. И без COW можно реализовать передачу по ссылке и по значению.
Что касается терминологии, то возможно, следовало упомянуть в статье, что имеется ввиду по ссылкой (я подправлю потом текст). В «Reference Counting Basics» сказано:
Since PHP allows user-land references, as created by the & operator, a zval container also has an internal reference counting mechanism to optimize memory usage.
Я имею ввиду именно те самые внутренние ссылки - internal reference - которые можно явно задать при помощи амперсанда или те, которые PHP создаст сам, где посчитает нужным. В данном случае он создаёт внутреннюю ссылку (не внутрь куда-то, а другую, не user-land) на массив при передаче его в функцию по значению.
Данное утверждение является на 100% неверным. Массивы не передаются по ссылке. Вы называете передачей по ссылке передачу по значению с использованием copy-on-write. То есть, путаете эти два механизма.
The reason is that the array zval is now shared between multiple variables: The $array variable outside the function and the $array variable inside it.
Т.е. подразумевается, что массив передался по ссылке и теперь две переменные указывают на один и тот же zval.
Я склонен считать, что массивы в PHP передаются по ссылке всегда.
Купил. В книге 272 страницы. Прочитал 102, больше не могу. Одна вода, не рекомендую.
Решардирование - это как? Вы просто добавляете новый шард и новые данные пишутся туда? Или нужно перетрясти все шарды переместив 1/N часть данных каждого на новый? Судя по тексту вы используете первый вариант, но термин "решардирование" смутил.
В JavaScript тоже 5
Хм, респект. Прям здорово у вас получается. Спасибо за статью )
Отличная статья, спасибо!
P. S. Хабр со временем растерял часть изображений, вот тут есть копия статьи, но с картинками: https://www.pvsm.ru/dokumentatsiya/290673
А кто-нибудь знает, где полная версию интервью? Что они только обрезок у интервью у себя на канале выложили..?
Как можно плюсануть статью? Сейчас +26 вижу, но что нажать не вижу...
Хм, отличная статья, спасибо. Для того, чтобы "одноразовые" контейнеры не копились, нужно использовать флаг --rm, не знаю был ли он у команды
run
в 2017-ом )Честно говоря я об этом не подумал, сосредоточился на другом. В любом случае нужно делать замеры и смотреть что да как.
Что есть quantify?
Да, глядя на эти схемы невольно начинаешь проникаться тем, о чём говорит Дуглас Крокфорд.
У меня вот такой PHP:
И вот такой вывод:
Т.е. PHP сразу в 3 раза меньше памяти потребляет, интересно. Покажите ваш
php -v
. Если уберётеbreak
из вашего кода, то увидите рост.Я прошу прощения, я вас с @FanatPHPперепутал. А ожидается как минимум мной потому что в документации сказано, что by default, variables are always assigned by value. А тонкие материи там освещены так себе. Поэтому и ожидается... дефолтное поведение.
Я устал с вами с спорить. Вы не ответили на вопрос как объяснить то, что при передаче массива в функцию и по ссылке и по значению кол-во потребляемой памяти не увеличивается. Потому что ответ очевиден, но вы не хотите признать эту очевидность, потому что всегда считали, что массив передаётся по значению. И ввиду нежелания принять этот факт решили свести всё к терминологическому спору. Моя статья не про точность терминов, а про то, как работать с массивами не вызывая чрезмерного потребления памяти. И эти чёртовы массивы в PHP передаются по ссылке, указателю или ещё какому-то фантомному референсу не вызывая копирования, как это ожидается, при передаче по значению. Потому что они передаются не по значению.
Вот ваше расписание на неделю:
Отличный анекдот, кстати )
Только это не объясняет почему в обоих случаях потребление памяти осталось одинаковым. Ведь очевидно, что копия сделана не была.
Copy-on-write - это не третий и никакой вообще способ передачи. Это механизм позволяющий оттянуть или вовсе избежать копирования параметров функции. Он опционален. И без COW можно реализовать передачу по ссылке и по значению.
Что касается терминологии, то возможно, следовало упомянуть в статье, что имеется ввиду по ссылкой (я подправлю потом текст). В «Reference Counting Basics» сказано:
Я имею ввиду именно те самые внутренние ссылки - internal reference - которые можно явно задать при помощи амперсанда или те, которые PHP создаст сам, где посчитает нужным. В данном случае он создаёт внутреннюю ссылку (не внутрь куда-то, а другую, не user-land) на массив при передаче его в функцию по значению.
Баста! Я придумал как доказать это:
Вывод:
Разницу в 2680 - 2616 = 64 опустим как несущественную.
Внутри
passByReference
как видно объём не увеличился вдвое. Почему? Потому что массив передаётся по ссылке.Внутри
passByValue
как видно объём не увеличился вдвое. Почему? По той же самой причине: массив передаётся по ссылке.@FanatPHP, как вы объясните наблюдаемые данные?
Действительно, в документации, кажется, нигде явно не написано, что массивы передаются по ссылке. На stackoverflow.com есть разбор этого вопроса: Are arrays in PHP copied as value or as reference to new variables, and when passed to functions? И там говорится, что по ссылке. Там же есть ссылка на другой документ (один я уже приводил: «Reference-counting and copy-on-write»): PHP internals: When does foreach copy? И там есть вот такие строки (вырвано из контекста, нужно ознакомиться с разделом целиком):
Т.е. подразумевается, что массив передался по ссылке и теперь две переменные указывают на один и тот же zval.
Я склонен считать, что массивы в PHP передаются по ссылке всегда.
Да, есть такое. Массивы в PHP хранят свой размер, а не вычисляют его при каждом вызове.