Модераторы: IZ@TOP, skyboy, SamDark, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проброс yield, Наследование и передача yield 
:(
    Опции темы
evilice
Дата 12.2.2015, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Всем доброго времени суток!
Пишу модуль для работы с MySQL. Есть основной класс:
Код

namespace mysql;

class Query {
    protected $sql = '';

    /** Other PHP-code **/

    public function execute() {
        return mysql_query($this->sql);
    }
    
    public function map() {
        if($res = $this->execute()) {
            while($map = (mysql_fetch_assoc($res))) {
                yield $map;
            }
        }
    }
}


Данный класс выполняет всю работу с запросами. Решил расширить его работу классом который возьмёт на себя обязанности SQL-конструктора. И чтобы не делать дополнительной работы решил унаследовать SQLConstructor от Query:
Код

namespace mysql;

class SQLConstructor extends \mysql\Query {
    /** Other PHP-code **/
    public function map() {
        $this->convert();
        yield parent::map();
    }
}


Ну и конечно же так я предполагал это всё использовать:
Код

$q = new \mysql\SQLConstructor();
$q->select('test_table', ['@in'=>['key', ['k.1', 'k2']]])->fields('name', 'key');
//--- SQL: select `name`, `key` from `test_table` where `key` in ('k.1', 'k.2')

foreach($q->map() as $data) {
     echo $data['key'].': '.$data['name'];
}


Как я наивно предполагал произойдёт проброс yield из Query в SQLConstruktor и дальше до момента востребования ))).

Если вкратце, то вопрос звучит следующим образом: как работать с yield при наследовании классов.
Заранее спасибо за помощь.
PM MAIL   Вверх
sQu1rr
Дата 13.2.2015, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: нет
Всего: 13



Цитата(evilice @  12.2.2015,  11:13 Найти цитируемый пост)
Если вкратце, то вопрос звучит следующим образом: как работать с yield при наследовании классов.

На это я к сожалению ответить не смогу, но я хотел бы спросить, какого, извините, хрена, здесь нужен yield вообще?
Он уменьшает в данном случае читаемость, производительность и увелчивает потребление памяти. Возвращайте просто массив, зачем вам yield?
PM MAIL Skype GTalk   Вверх
baldina
Дата 13.2.2015, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



evilice, вот так
sQu1rr, yield немного увеличивает потребление памяти, но по сравнению с размером массива это копейки.
PM MAIL   Вверх
sQu1rr
Дата 13.2.2015, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: нет
Всего: 13



baldina, ну да, но я в таком случае вообще не вижу смысла йилда. возврат ссылки на массив даст тот же результат.
PM MAIL Skype GTalk   Вверх
baldina
Дата 13.2.2015, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



нет. смысл что бы вообще не создавать массив
не говоря уж что возврат по ссылке это моветон затрудняет понимание и отладку
щас нарисую

Добавлено @ 22:22
ну что-то в этом роде http://ideone.com/ANjtPF

Это сообщение отредактировал(а) baldina - 13.2.2015, 22:25
PM MAIL   Вверх
baldina
Дата 13.2.2015, 23:06 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



evilice, вы используете современные возможности языка, и тут же - устаревший mysql_, который скоро вообще выбросят. нелогично.
PM MAIL   Вверх
sQu1rr
Дата 16.2.2015, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: нет
Всего: 13



Цитата(baldina @  13.2.2015,  19:17 Найти цитируемый пост)
нет. смысл что бы вообще не создавать массив

И правда, внимательность меня порой подводит


Цитата(baldina @  13.2.2015,  19:17 Найти цитируемый пост)
ну что-то в этом роде http://ideone.com/ANjtPF

Сюда бы добавить тест на скорость
PM MAIL Skype GTalk   Вверх
baldina
Дата 16.2.2015, 14:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата(sQu1rr @  16.2.2015,  12:32 Найти цитируемый пост)
Сюда бы добавить тест на скорость 

легко

PM MAIL   Вверх
sQu1rr
Дата 16.2.2015, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: нет
Всего: 13



Цитата(baldina @  16.2.2015,  11:08 Найти цитируемый пост)
легко

Если честно, я не понимаю  smile 
Логика мне подсказывает что:
1. Так как мы используем fetchall - memory_usage будет в целом одинаковая, а memory_peak_usage будет равна memory_usage для fetchall - это понятно
2. Скорость будет выше у fetchall так как массив заполняется сразу целиком и дальше мы его просто используем. Имеет ли место быть погрешность из-за того что база находится в оперативной памяти а не на сервере: откуда такая странная разница в скорости?
Или я чего-то не понимаю?
PM MAIL Skype GTalk   Вверх
baldina
Дата 16.2.2015, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



пример с бд в памяти имхо наиболее чистый, т.к. нет дополнительных факторов, связанных с диском и сетью
а причины могут быть в том, что
- прокинуть 100k данных нужно время
- массив в php это не массив, поэтому эффективности от последовательного расположения в памяти ждать не приходится
- меньше выделенной ОП - меньше вероятности выпадения в своп и перезагрузки кеша

а накладные расходы yield видимо не так уж велики. щас нарисую с итератором, предполагаю что результат будет похож

Добавлено через 13 минут и 51 секунду
http://ideone.com/WhrM4g
результат примерно как ожидался. с итератором памяти столько же, но медленнее (больше кода интерпретируется)
PM MAIL   Вверх
sQu1rr
Дата 16.2.2015, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: нет
Всего: 13



Плюсик вам, спасибо большое smile
PM MAIL Skype GTalk   Вверх
baldina
Дата 16.2.2015, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



спасибо)
sQu1rr, я немножко поигрался, вот немного расширенный пример http://ideone.com/NodKJy
видно, что отклонение результатов в тестах с передачей массива больше - это, видимо, свидетельствует о бОльшей зависимости от текущего состояния системы (и/или бОльшего влияния на него) в случае бОльшего потребления ресурсов
PM MAIL   Вверх
MaXL
Дата 2.9.2015, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Насколько корректно привести код baldina к следующему виду:
Код

    <?php
     
    function foo () {
      for ($x=0; $x != 5; ++$x)
        yield $x;
    }
     
    function bar () {
      return foo();
    }
     
    foreach (bar() as $x)
      echo $x;


Функция foo возвращает генератор, в функции bar мы ничего не изменяем, поэтому можем его просто "пробросить".


--------------------
MaXL
PM MAIL   Вверх
baldina
Дата 2.9.2015, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



корректно и практически ничего не меняет в смысле производительности и потребления памяти
PM MAIL   Вверх
Google
  Дата 26.5.2019, 23:08 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1180 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.