Зачем рефлексия в Model::formName()?

Уже исправленные репорты или принятые предложения
Ответить
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Зачем рефлексия в Model::formName()?

Сообщение BrusSENS » 2017.07.24, 09:02

Доброго времени!
Вот не могу понять, зачем используется рефлексия в yii\base\Model...

Код: Выделить всё

public function formName()
{
    $reflector = new ReflectionClass($this);
    return $reflector->getShortName();
}
Понятное дело, что особо на память не влияет, но всё же, какой профит использования рефлексии именно здесь? Можно ведь использовать что то вроде

Код: Выделить всё

public function formName()
{
    return ltrim(__CLASS__, __NAMESPACE__);
}
По идее же получим ровно то же самое, но всё таки быстрее и без рефлексии...
P.S.: вопрос чисто для себя, хочу просто понять почему именно так?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x

Аватара пользователя
samdark
Администратор
Сообщения: 9188
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Зачем рефлексия в Model::formName()?

Сообщение samdark » 2017.07.25, 18:20

Точно быстрее? Замерьте.

Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Зачем рефлексия в Model::formName()?

Сообщение BrusSENS » 2017.07.26, 06:43

samdark писал(а):
2017.07.25, 18:20
Точно быстрее? Замерьте.
Хм... И в прямь... Я несколько удивлён. Хотя выигрыш в полкило памяти по идее можно получить, но понятно, что не в ущерб скорости. Спасибо за ответ!
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Зачем рефлексия в Model::formName()?

Сообщение zelenin » 2017.07.26, 10:19

BrusSENS писал(а):
2017.07.26, 06:43
samdark писал(а):
2017.07.25, 18:20
Точно быстрее? Замерьте.
Хм... И в прямь... Я несколько удивлён. Хотя выигрыш в полкило памяти по идее можно получить, но понятно, что не в ущерб скорости. Спасибо за ответ!
на чем мерял?
у меня на 7.1 рефлексия медленнее в 4-5 раз второго варианта, и в 2-3 раза медленнее варианта с explode полного класса. Что как бы очевидно, что так и должно быть.

Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Зачем рефлексия в Model::formName()?

Сообщение BrusSENS » 2017.07.26, 11:14

zelenin писал(а):
2017.07.26, 10:19
на чем мерял?
у меня на 7.1 рефлексия медленнее в 4-5 раз второго варианта, и в 2-3 раза медленнее варианта с explode полного класса. Что как бы очевидно, что так и должно быть.
Мерял без спец инструментов, простым microtime(). Но с другими инструментами думаю может поменяться. Но по факту 500 байт памяти рефлексия кушает, опять же при замере банальным memory_get_usage(). Вот посему и задаюсь вопросом, почему бы не использовать банальную конструкцию

Код: Выделить всё

public function formName()
{
    return substr(strrchr(static::className(), "\\"), 1);
}
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Зачем рефлексия в Model::formName()?

Сообщение zelenin » 2017.07.26, 11:23

ну ты что-то не так мерял, или не учитывал кэширование

http://sandbox.onlinephpfunctions.com/c ... 2d44055502
http://sandbox.onlinephpfunctions.com/c ... 5b5f4468b7

т.к. кэш, берем самый быстрый результат: 1) 9 2) 3.

Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Зачем рефлексия в Model::formName()?

Сообщение BrusSENS » 2017.07.26, 11:33

zelenin писал(а):
2017.07.26, 11:23
ну ты что-то не так мерял, или не учитывал кэширование

http://sandbox.onlinephpfunctions.com/c ... 2d44055502
http://sandbox.onlinephpfunctions.com/c ... 5b5f4468b7

т.к. кэш, берем самый быстрый результат: 1) 9 2) 3.
Да, про кэш совсем забыл. Проверил на onlinephpfunctions конструкцию

Код: Выделить всё

public function formName()
{
    return substr(strrchr(static::className(), "\\"), 1);
}
Она всё равно быстрее получается.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x

Ответить