Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап [WIP] Code Snippets - Полезные куски кода и некоторые неочевидные вещи. [+ Ликбез]

а вот и аргумент почему
топ аргументы, а то, что замена строки гораздо дольше, чем замена символа, всем почему то пофиг

Ну а по поводу того, что вы использовали метод замены колор кода из апи целых 0 раз говорит лишь о качестве написанного вами кода
Обращаться во множественном числе ко мне не надо. если Вы хотели показать свою вежливость, то в этом случае обращения пишутся с большой буквы


А ещё replace - не прямая альтернатива translate, ибо заменит & в сообщении, даже если он используется не для цветовых кодов.
Также соглашусь с @Shevchik, так как метод реплейса заменяет абсолютно все '&'
(Ни разу не сталкивался с подобным, поэтому не думал об этом.)
Окес, терь буду юзать (ибо стало понятно зачем), но вот разница в 10-15 раз все еще удручает.
 
Последнее редактирование:
топ аргументы, а то, что замена строки гораздо дольше, чем замена символа, всем почему то пофиг


Обращаться во множественном числе ко мне не надо. если Вы хотели показать свою вежливость, то в этом случае обращения пишутся с большой буквы




(Ни разу не сталкивался с подобным, поэтому не думал об этом.)
Окес, терь буду юзать (ибо стало понятно зачем), но вот разница в 10-15 раз все еще удручает.
Ты запускал несколько раз заново. Что говорит о полном непонимании что такое JIT и как он работает. Ищи статье на хабре по бенчмаркингу в JVM и Java.
 
Ты запускал несколько раз заново. Что говорит о полном непонимании что такое JIT и как он работает.
Хочется сказать тебе тоже самое.

(ща бы затупить и поставить в цикл строку data=data.replace();, хотя это все еще никак не меняет скорости его выполнения.)
 
Последнее редактирование:
Данный бенчмарк всё ещё неправильный, ибо OSR, и не учтён прогрев (банально если свапнуть местами цикл с реплейсом и цикл с translate получатся другие результаты). Короче используй JMH для бенчей, и будет тебе счастье. И результаты кстати примерно одинаковыми получатся (на java8, на java7 с replace всё будет плохо).

P.S. И при всём при этом на результаты на самом деле наплевать, ибо кроме крайних случаев - транслейт кодов выполняется один раз при инициализации сообщения. (Да и простой реплейс - некорректный способ трансляции колор кодов, но я об этом уже говорил. А что самое забавное - технически способ трансляции в спайготе тоже неправильный, ибо не учитывает суррогатные пары юникода, и хоть это и работает в теекущий момент, расширение таблицы цветовых кодов в некоторых случаях выстрелит в ногу).
А по теме - пожалуй стоит упомянуть некоторые странности с PlayerInteractEvent.
Дело в том что у этого эвента очень неочевидное поведение с точки зрения состояния отменённости.
Почти каждый наверняка сталкивался что если игнорировать отменённые эвенты, то в некоторых случаях PlayerInteract эвент будет считаться отменённым, но само действие выполнится, но если при этом его отменить, то действие не выполнится, что вызывает много вопросов по типу какого хера. А всё на самом деле просто. Если посмотреть в исходники, то можно увидеть что вот так определён PlayerInteractEvent::isCancelled:
Java:
public boolean isCancelled() {
     return this.useInteractedBlock() == Event.Result.DENY;
}
а вот так PlayerInteractEvent::setCancelled:
Java:
public void setCancelled(final boolean cancel) {
     this.setUseInteractedBlock(cancel ? Event.Result.DENY : ((this.useInteractedBlock() == Event.Result.DENY) ? Event.Result.DEFAULT : this.useInteractedBlock()));
     this.setUseItemInHand(cancel ? Event.Result.DENY : ((this.useItemInHand() == Event.Result.DENY) ? Event.Result.DEFAULT : this.useItemInHand()));
}
Таким образом видно что для того чтобы эвент считался отменённым, достаточно чтобы не было взаимодействия с блоком (то бишь тыкаье воздуха даже с итемом руке считается отменённым сразу, даже если итем всё равно заюзается (что кстати нехило доставляло тем кто пытался запретить использовать некоторые потионы скажем)), а вот сама отмена и отменяет взаимодействие с блоком, и использование итема.
 
Последнее редактирование:
О войне с tacc и replace:
Код:
Benchmark                         Mode   Cnt  Score      Error    Units
QuestionResolver.NCstringReplace  avgt   50   207,018    ± 0,418  ns/op
QuestionResolver.NCtacc           avgt   50   486,524    ± 0,784  ns/op
QuestionResolver.stringReplace    avgt   50   796,546    ± 1,559  ns/op
QuestionResolver.tacc             avgt   50   2193,245   ± 3,228  ns/op
С префиксом NC - без цвета.

Полный лог, исходник.

Алярма: Результат этого бенча не говорит о том, что надо выкинуть tacc к чертям и не использовать его вовсе, я просто показал что быстрее. Только считать надо не наносекунды. И не читать конфиг в событиях попутно используя replace по всякому поводу.
 
Последнее редактирование:
О войне с tacc и replace:
Код:
Benchmark                         Mode   Cnt  Score      Error    Units
QuestionResolver.NCstringReplace  avgt   50   207,018    ± 0,418  ns/op
QuestionResolver.NCtacc           avgt   50   486,524    ± 0,784  ns/op
QuestionResolver.stringReplace    avgt   50   796,546    ± 1,559  ns/op
QuestionResolver.tacc             avgt   50   2193,245   ± 3,228  ns/op
С префиксом NC - без цвета.

Полный лог, исходник.

Алярма: Результат этого бенча не говорит о том, что надо выкинуть tacc к чертям и не использовать его вовсе, я просто показал что быстрее. Только считать надо не наносекунды. И не читать конфиг в событиях попутно используя replace по всякому поводу.
почему все забывают что реплейс & на параграф это изначально не верный способ колоризации? ведь это вызовет ошибки парсинга в некоторых случаях и полностью сделает символ & бесполезным.

более сложный регекс который работает по функциональности на уровне tacc будет работать медленнее
 
Мерят наносекунды, ведь сервер лагает из-за tacc, а не из-за того, что ты говнокодер.

Вообще не представляю, сколько МБ данных надо конвертировать через tacc, что-бы это было хоть как-то заметно.
 
Ликбез: Отладка плагина (Удаленная отладка)​
Это немного не в тему топика, но половина проблем, которые пишутся сюда решились бы если бы люди знали об отладке.
Отладчики есть в любой IDE. Они позволяют вам пройти по коду по шагам и посмотреть что делает ваша программа на каждом шаге, и соответствует ли это вашим ожиданиям. При этом вам не нужно захламлять код выводом промежуточных отладочных сообщений и не получится такой ситуации, когда вы забыли убрать сообщения об отладке из кода и из-за этого на сервере плагин спамит ненужной (а зачастую совершенно неинформативной, простите за каламбур) информацией.
Подробнее об отладке:
- Debugging Your First Java Application [EN]
- Отладчик IntelliJ IDEA
Эти инструкции приведены для ознакомления с отладкой, поэтому не имеет большого значения, что они для IntelliJ IDEA. В остальных IDE отладчики имеют схожий функционал, за небольшими исключениями.

Люди, которые не пользуются отладкой при разработке делятся на две категории:

  1. Те кто не знают об отладке вообще (а что так можно было?);
  2. И те кто не знают как отлаживать плагин, который запускается не у вас внутри IDE, а на сервере (удаленная отладка/Remote Debug).
Первые неизбежно попадают во вторую группу после того как понимают, что отладка это круто. Цель этого поста - кратко рассказать об удалённой отладке, то есть как отлаживать Java приложения, которые запускаются вне IDE.

Самый простой способ (не могу не прорекламировать) - это использовать Gradle + BukkitGradle (пример и инструкция по ссылке).

Второй способ.
Всё будет, опять же, показываться на примере IDEA, но в остальных IDE всё делается по аналогии.
Краткая инструкция:

  1. Run -> Edit Configurations...
  2. Нажать "+" в левом верхнем углу (или Alt + Insert)
  3. Выбрать "Remote" в появившемся списке
  4. Ввести необходимые настройки:
    6423f15992044d6cabe89707abce5102.png

    Галочка "Single instance only" говорит о том, что одновременно может быть запущена только одна копия отладчика (больше не имеет смысла, да и не получится).
    Так же вам может понадобиться изменить Host и Port, если сервер запускается не на локальной машине.
  5. Нужно добавить опцию JVM (которая обведена на скриншоте) в ваш скрипт запуска сервера или в переменную среды JAVA_OPTS.
  6. Нажать "OK" для сохранения
suspend
Если значение параметра равно y, виртуальная машина будет ждать подключения приложения-отладчика. Этот параметр удобно использовать для проверки правильности настройки подключения из IDE.​

server

Если значение этого параметра равно y, запускаемое приложение ожидает подключения приложения-отладчика, то есть работает как сервер. В противном случае оно подключается к приложению-отладчику по заданному адресу (нам понадобится только значение y).​

address

Адрес для подключения. В нашем случае, когда server установлено в y, этот параметр указывает к какому порту ожидается подключение.​

После этого запустите сервер и, когда он запустится, можете начинать отладку:
f2829c99c62b446e87bbf53def7d3902.png


Дополнительные материалы:
- Attach Intellij-IDEA debugger to a running java process [EN]
 
Определение версии nms почти без проблем или "для тех, кто столкнулся с какулей от md_5 при определении версии nms из версии сервера":

Java 8 Stream:
Java:
public static String getNmsVersion() {
    String nmsPackage = "net.minecraft.server";
    String pckg = Arrays.stream(Package.getPackages())
            .filter(pk -> pk.getName().startsWith(nmsPackage))
            .map(pk -> pk.getName()).findFirst().orElse(null);

    if (pckg == null) {
        throw new RuntimeException("Failed to recognize nms version");
    }

    return pckg.substring(nmsPackage.length() + 1);
}
Java 7:
Java:
public static String getNmsVersion() {
    String nmsPackage = "net.minecraft.server";
    for (Package pack : Package.getPackages()) {
        if (pack.getName().startsWith(nmsPackage)) {
            return pack.getName().substring(nmsPackage.length() + 1);
        }
    }
    throw new RuntimeException("Failed to recognize nms version");
}
xDark:
Java:
public static String getNmsVersion() {
    return Bukkit.getServer().getClass().getPackage().getName()
            .replace("org.bukkit.craftbukkit", "");
}
 
Последнее редактирование:
Определение версии nms почти без проблем или "для тех, кто столкнулся с какулей от md_5 при определении версии nms из версии сервера":
Java:
public static String getNmsVersion() {
    Set<String> set = Arrays.stream(Package.getPackages())
            .filter(pckg -> pckg.getName().startsWith("net.minecraft.server"))
            .map(pckg -> pckg.getName())
            .collect(Collectors.toSet());
    if (set.size() > 1 || set.isEmpty()) {
        throw new RuntimeException("Failed to recognize nms version.");
    }

    String pckg = set.iterator().next();
    return pckg.substring(21);
}
Лооол. Рили такая есть проблема? Пока с таким не сталкивался....
 

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

Назад
Верх