Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Рефлексия и с чем ее едят.

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lisenochek, 6 мар 2017.

  1. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Отвечу сразу всем в этом треде. Почему я против ПротоколЛиба и прочих таких штук? Это значительно влияет на производительность. Причём похлеще, чем рефлексия (скорее всего внутри PL она тоже есть, к слову).
    Большое количество пакетов порождает соответствующее количество врапперов (или как там называются обертки пакетов). Создавать враппер под каждый пакет - это нецелесообразно как минимум по той причине, что из всех видов пакетов по факту будут использоваться процентов десять. Но сборщику мусора от этого не легче.
    А уж если пакеты и вовсе не нужно принимать, то какой смысл использовать ПротоколЛиб? Возможно, конечно, прослушка и отключается в конфиге, но что-то я сомневаюсь.
    Вообще я слышал, что ПротоколЛиб и врапперы теперь разделены. Не совсем понятно, как это работает. Но если всё же работает, то и вправду можно использовать какую-нибудь публичную библиотеку.

    Также хотел спросить у рефлексофобов, чем же так плох этот инструмент? Что конретно в нём нагружает значительно больше, чем самый обычный линейный код? Если всё грамотно кэшировать, то никакой значительной разницы между обычным кодом и рефлексией не будет. Вы даже в байткоде различий не найдете - что тут, что там вызов конкретных конструкторов или методов, что тут, что там работа с определёнными полями. Ещё раз повторюсь, что нужно лишь научиться кэшировать классы, поля, методы и всё остальное, что понадобится в рантайме. Помнится, при каких-то тестах рефлексия по времени даже выигрывала у обычного кода.

    Что касается асм, то штука, конечно, приятная, да вот только сложная. На создание кода может уходить в десятки, а то и в сотни больше человекочасов. Непозволительная роскошь.
     
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Так не бывает.[DOUBLEPOST=1488931144,1488931065][/DOUBLEPOST]А вот asm реально рулит, можно один раз пропатчить и не лезть в рефлексии вообще. И не потерять производительности.[DOUBLEPOST=1488931254][/DOUBLEPOST]P.s сервера с мультиверсиями спокойно тянут до 800 онли, сомневаюсь что протокол хоть где то тормозит.[DOUBLEPOST=1488931372][/DOUBLEPOST]Другое дело с модами, там может что то не так напатчится и будет работать не корректно. Ибо моды любят изменять ванилоклассы.
     
  4. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Ну начнем с того, что мультиверсия - это не ПротоколЛиб. Многие пакеты банально не нужно обрабатывать (изменять на лету).
    Ну а если речь всё-таки о либе, то тут всё очевидно: постоянное выделение и высвобождение памяти из-за врапперов пакетов - это явно не улучшает ситуацию. С либой 800 человек, а без него, допустим 900. Ну либо сервер не падает.
    По поводу модов не знаю, ни разу дела с такими серверами не имел.
     
  5. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    В том то и дело, что одинаково держит онлайн. А что еще нужно то? А мультиверсия и делается на протоколе, лалка.[DOUBLEPOST=1488932656,1488932592][/DOUBLEPOST]Там быстрее отвалится тикание игроков, чем какой нить протоколлиб.[DOUBLEPOST=1488932766][/DOUBLEPOST]А вообще лучше спросить у шевчика. Он точно знает, сколько жрет протоколлиб.[DOUBLEPOST=1488932949][/DOUBLEPOST]
    Яб сказал, но конкуренция все лела. А то узнают что тот мод может робить без багов на котле :D.
     
  6. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    ProtocolSupport не требует ProtocolLib ну вообще никак, это 2 отдельные библиотеки.
    ProtocolLib не жрёт почти ничего если его не использовать, это просто +2 элемента в пайплайне тогда.
    Если использовать, то оверхед всё равно копеечный ибо все враппер классы нагенерены через cglib. И все методы PacketContainer тоже в общем-то внутри генерятся cglibом для каждого типа пакета.[DOUBLEPOST=1488953895][/DOUBLEPOST]Для рефлексолюбов, только MethodHandle::invokeExact может иметь скорость выполнения близкой к выполнению обычного байткода, ибо транслируется в соответствующую интсрукцию если повезёт, любая отсальная рефлективная фигня исполняется иногда и в 100 раз медленней. Так что рефлексией нужно пользоваться с умом.
     
  7. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Не знаком с технологией cglib, но знающие люди утверждают, что использование PL не очень приветствуется на крупных серверах по тем причинам, что я озвучил выше.
    Тут вопрос в том, стоит ли ставить PL лишь ради отправки пакетов.
    Что касается рефлексии, то тут не очень понятно, из-за чего падает скорость выполнения (по сравнению с обычным кодом). Допустим, использование конструктора и в том, и в другом случае вызывает цепь конкретных действий: выделение памяти, запись данных объекта, создание ссылки на него.
    Скажу честно, абсолютно чистых тестов я не проводил, но в рамках собственных задач рефлексия показывала занятные результаты: например, получение данных из приватного поля вместо использования геттера (который, в свою очередь, производил какие-то ненужные действия).
     
  8. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Рефлексия очень медленная. Я уже и сам испытал разницу в скорости в своем плагине. Почему решил отказаться он нее. Ну там где скорость выполнения не играет роль, то вполне можно. Ну или одноразовая рефлексия, тоже не играет роли.[DOUBLEPOST=1489047133,1489046899][/DOUBLEPOST]P.s для тестов можешь получить к примеру nbt с итемстака напрямую и рефлексией.
     
  9. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
  10. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
  11. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    У меня руки не из жопы, я клиентский сокет полностью на рефлексии писал с конструкторами и т.д - все работает. В любом случае добавить вывод ошибки - дело 1 минуты.
     
  12. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Это не повод игнорировать исключения. Вроде опытный кодер, а до сих пор не знаешь, что программирование - это магия
     
  13. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Ты не поверишь, но я просрал 2 часа из-за:
    1) getConfig().getConfigurationSection("blabla").getKeys(true)
    Не знал на что влияет аргумент функции getKeys(boolean) и раньше он мне не мешал, все работало. В этот раз не свезло. Надо было просто поменять на false.
    2) Забыл, что в функции split(String) есть очень проблемы с символами.
    Сделал split("|"), после долгих мук заметил и вспомнил, что надо split("[|]")...

    Вот тебе и из-за мелочей дичь выходит. А еще из-за того, что пишешь все подряд без тестов.
     
  14. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    Читать документацию? Зачем? И так сойдёт!
     
  15. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Именно поэтому не надо игнорировать исключения. Банального e.printStackTrace() хватит чтобы не улететь в космос в случае чего. Да и человек выше прав: доки - наше всё. Но одному другому не мешает
     
  16. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    46
    Напоминает поиски двери в стене с помощью ударов головы :D
     
  17. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Как-то очень слабо, я думал будет интереснее. Это ж от руки за 5 минут пишется.
    А где же всякое получение методов по аргументам, манипуляции с финальными объектами, добавление энамов в конце концов?
     
  18. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    Это для упрощения работы с исключениями :D
     
  19. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Мне это не надо было в работе с плагинами. Есть еще один класс для работы с клиентом хкс, но те методы вряд-ли тут нужны. Я с рефлексией могу сделать что угодно и как угодно, дайте только задачу. Я могу напилить годное апи, если будут какие-то цели.
     
  20. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    @Qmaks
    Вообще лучше было бы передавать эти исключения выше. Тогда не потребовалось бы возвращать null, с которым только лишние проверки появляются.
     
  21. Qmaks

    Qmaks Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Да, верно.[DOUBLEPOST=1490316982,1489169025][/DOUBLEPOST]
    Добавил изменение полей (Даже если они финальные).
     

Поделиться этой страницей