|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
|
evilice |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 27.11.2008 Репутация: нет Всего: нет |
Всем доброго времени суток!
Пишу модуль для работы с MySQL. Есть основной класс:
Данный класс выполняет всю работу с запросами. Решил расширить его работу классом который возьмёт на себя обязанности SQL-конструктора. И чтобы не делать дополнительной работы решил унаследовать SQLConstructor от Query:
Ну и конечно же так я предполагал это всё использовать:
Как я наивно предполагал произойдёт проброс yield из Query в SQLConstruktor и дальше до момента востребования ))). Если вкратце, то вопрос звучит следующим образом: как работать с yield при наследовании классов. Заранее спасибо за помощь. |
||||||
|
|||||||
sQu1rr |
|
|||
Опытный Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: нет Всего: 13 |
На это я к сожалению ответить не смогу, но я хотел бы спросить, какого, извините, хрена, здесь нужен yield вообще? Он уменьшает в данном случае читаемость, производительность и увелчивает потребление памяти. Возвращайте просто массив, зачем вам yield? |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
evilice, вот так
sQu1rr, yield немного увеличивает потребление памяти, но по сравнению с размером массива это копейки. |
|||
|
||||
sQu1rr |
|
|||
Опытный Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: нет Всего: 13 |
baldina, ну да, но я в таком случае вообще не вижу смысла йилда. возврат ссылки на массив даст тот же результат.
|
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
нет. смысл что бы вообще не создавать массив
не говоря уж что возврат по ссылке это моветон затрудняет понимание и отладку щас нарисую Добавлено @ 22:22 ну что-то в этом роде http://ideone.com/ANjtPF Это сообщение отредактировал(а) baldina - 13.2.2015, 22:25 |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
evilice, вы используете современные возможности языка, и тут же - устаревший mysql_, который скоро вообще выбросят. нелогично.
|
|||
|
||||
sQu1rr |
|
|||
Опытный Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: нет Всего: 13 |
И правда, внимательность меня порой подводит
Сюда бы добавить тест на скорость |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
||||
|
||||
sQu1rr |
|
|||
Опытный Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: нет Всего: 13 |
Если честно, я не понимаю Логика мне подсказывает что: 1. Так как мы используем fetchall - memory_usage будет в целом одинаковая, а memory_peak_usage будет равна memory_usage для fetchall - это понятно 2. Скорость будет выше у fetchall так как массив заполняется сразу целиком и дальше мы его просто используем. Имеет ли место быть погрешность из-за того что база находится в оперативной памяти а не на сервере: откуда такая странная разница в скорости? Или я чего-то не понимаю? |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
пример с бд в памяти имхо наиболее чистый, т.к. нет дополнительных факторов, связанных с диском и сетью
а причины могут быть в том, что - прокинуть 100k данных нужно время - массив в php это не массив, поэтому эффективности от последовательного расположения в памяти ждать не приходится - меньше выделенной ОП - меньше вероятности выпадения в своп и перезагрузки кеша а накладные расходы yield видимо не так уж велики. щас нарисую с итератором, предполагаю что результат будет похож Добавлено через 13 минут и 51 секунду http://ideone.com/WhrM4g результат примерно как ожидался. с итератором памяти столько же, но медленнее (больше кода интерпретируется) |
|||
|
||||
sQu1rr |
|
|||
Опытный Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: нет Всего: 13 |
Плюсик вам, спасибо большое
|
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
спасибо)
sQu1rr, я немножко поигрался, вот немного расширенный пример http://ideone.com/NodKJy видно, что отклонение результатов в тестах с передачей массива больше - это, видимо, свидетельствует о бОльшей зависимости от текущего состояния системы (и/или бОльшего влияния на него) в случае бОльшего потребления ресурсов |
|||
|
||||
MaXL |
|
|||
Developer Профиль Группа: Участник Сообщений: 380 Регистрация: 24.10.2005 Где: Владивосток Репутация: нет Всего: 2 |
Насколько корректно привести код baldina к следующему виду:
Функция foo возвращает генератор, в функции bar мы ничего не изменяем, поэтому можем его просто "пробросить". -------------------- MaXL |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
корректно и практически ничего не меняет в смысле производительности и потребления памяти
|
|||
|
||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |