Ссылки и производительность

Exel

Новичок
Ссылки и производительность

Возник вот такой вопросик:
Понадобилось мне тут сделать массив, такой что каждый элемент можно было бы получить использую два различных индекса. Придумал следующую штуку:
PHP:
$test = array('key1'=>'value');
$test['key2'] = &$test['key1'];
Массив может содержать примерно 20 элементов, но при этом весь массив может весить около мегабайта.
Оправдан ли такой способ экономии памяти или это экономия на спичках?
Влияет ли на производительность создание кучи ссылок? Может лучше продублировать данные?

В догонку:
Очень нравится мне паттерн singleton, развелось их у меня пара десятков. Очень удобно в любом месте дернуть необходимый класс через getInstance(). Но первое: получается еще куча ссылок, а второе то, что экземпляры таких классов живут в памяти до самого конца исполнения скрипта. Грозит ли каким либо снижением производительности такое частое использование подобных классов?

И последний вопрос:
Насколько я знаю создание простой переменной проходит несколько быстрее чем ссылки. А вот получение данных по ссылке и напрямую длится одинаково по времени или нет?
 

zerkms

TDD infected
Команда форума
Массив может содержать примерно 20 элементов, но при этом весь массив может весить около мегабайта.
Оправдан ли такой способ экономии памяти или это экономия на спичках?
как только у тебя встанет проблема изза этого массива - вот тогда и будешь думать. а пока забей и делай так как удобнее.
Очень нравится мне паттерн singleton, развелось их у меня пара десятков. Очень удобно в любом месте дернуть необходимый класс через getInstance().
не стоит слишком налегать на синглтон. он весьма нехороший паттерн.
Насколько я знаю создание простой переменной проходит несколько быстрее чем ссылки. А вот получение данных по ссылке и напрямую длится одинаково по времени или нет?
если я ошибаюсь - поправьте, но имхо - создание именно копии данных происходит только при модификации. при обычном присваивании происходит передача по ссылке.
 

Exel

Новичок
не стоит слишком налегать на синглтон. он весьма нехороший паттерн.
Расскажите почему.

если я ошибаюсь - поправьте, но имхо - создание именно копии данных происходит только при модификации. при обычном присваивании происходит передача по ссылке.
Правильно ли я понимаю:
Если, например, в объекте хранится массив данных, объект его возвращает по запросу:
$result = $obj->getData();
Получается, что php автоматически присвоит $result ссылку на массив, который остался в объекте, и $result будет ссылкой до тех пор пока мы его не попытаемся изменить. Верно?
Т.е. если вернуться к описанному мной выше массиву, то при простом дублировании данных под разными ключами, php сам создаст описанную мной конструкцию.
 

zerkms

TDD infected
Команда форума
да
Расскажите почему.
потому что ты таким образом помещаешь данные в глобальную область видимости, да ещё и при этом пользуешься также не очень хорошей практикой вызова статических методов
 

hermit_refined

Отшельник
Получается, что php автоматически присвоит $result ссылку на массив
он не присвоит ссылку - т.е. "ссылку" в терминах PHP. Реализация же самого PHP вряд ли вас интересует.
Данные дублироваться не будут, да.

Всё просто - вы не должны об этом заботиться. Создавать ссылку надо только тогда, когда это действительно нужно, а не из соображений псевдо-оптимизации.

Если нужны подробности - они в поиске по Copy-On-Write PHP.
 

Exel

Новичок
Если нужны подробности - они в поиске по Copy-On-Write PHP.
Про это я уже почитал, я имел ввиду не ссылку &, а refcount+=1

потому что ты таким образом помещаешь данные в глобальную область видимости
А что в этом плохого?

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

zerkms

TDD infected
Команда форума
А что в этом плохого?
если ты хочешь писать ОО код, тогда ты должен понимать - что всё, что используется в методе/функции, должно быть получено из аргументов метода/функции а не из глобальной области видимости. аналогично - всё что функция/метод возвращает - должно быть возвращено посредством return а не в глобальную область видимости
где почитать про обоснования этого утверждения?
а причины банальны:
1. затруднение тестирования
2. жёсткая привязка к конкретному классу (с последующей невозможностью подмены класса на другой)
 

Exel

Новичок
всё, что используется в методе/функции, должно быть получено из аргументов метода/функции
С этим согласен, мой подход затруднит повторное использование отдельного класса, но удобство повторного использование набора классов (framework), я думаю, ничуть не пострадает.


2. жёсткая привязка к конкретному классу (с последующей невозможностью подмены класса на другой)
А вот с этим, пожалуй, не соглашусь.
У меня класс Db(singleton), который в свою очередь является оберткой к фабрике. Т.о. я спокойно могу использовать классы для различных СУБД и дописывать новые.
 
Сверху