FastEvent avatar

FastEvent [1.21.1] [1.20.1] [1.19.2]

FastEvent

Это модификация для Forge/Neoforge, оптимизирующая одну из фундаментальных систем платформы — систему событий.

Производительность

Для демонстрации результатов использованы JMH-бенчмарки из PR в проект Cleanroom, где применялся аналогичный подход оптимизации:

Регистрация 10 000 обработчиков без вызова событий:

Benchmark                               Mode  Cnt     Score     Error  Units
BusPerformanceTest.register10000Legacy  avgt    5  1126.498 ± 284.633  ms/op
BusPerformanceTest.register10000Modern  avgt    5  1058.961 ± 173.586  ms/op

Ускорение ≈6.4%.

Регистрация 1 000 обработчиков с 10 000 вызовов событий:

Benchmark                                       Mode  Cnt     Score      Error  Units
BusPerformanceTest.register1000test10000Legacy  avgt    5  4407.963 ± 4250.643  ms/op
BusPerformanceTest.register1000test10000Modern  avgt    5  3550.578 ± 1991.352  ms/op

Ускорение ≈24%.

Исходный PR

https://github.com/CleanroomMC/Cleanroom/pull/328#issuecomment-2801099504

Принцип работы

(Технические детали)

Традиционная реализация EventBus использует reflection (method.invoke(...)) для вызова обработчиков событий, что неэффективно. Для оптимизации генерируются специальные классы-обёртки, заменяющие reflection-вызовы.

FastEvent заменяет генерацию классов на лямбда-выражения, что даёт:

  1. Ускорение создания обработчиков
  2. Возможность дополнительной оптимизации со стороны JVM

Пример реализации:

class Listen {
    public void onEvent(Event event) {
    }
}
Listen lis = new Listen();

// Традиционный подход
class IEventListener$Listen$onEvent implements IEventListener {
    private Listen instance;
    public IEventListener$Listen$onEvent(Listen instance) {
        this.instance = instance;
    }
    @Override
    public void invoke(Event event) {
        instance.onEvent(event);
    }
}
IEventListener handler = new IEventListener$Listen$onEvent(lis);

// Подход FastEvent
IEventListener handler = lis::onEvent;

Скачать FastEvent

 
Тип Скачать Версия Загрузчик Обновлено Размер
ReleaseFastEvent-1.21.1-forge-1.1.1.jar1.21.1Forge19 мая 202531,8 КБ
AlphaNeoForge version not doing anything, do not use1.21.1NeoForge19 мая 202532,4 КБ
ReleaseFastEvent-1.16.5-1.1.1.jar1.16.5Forge14 мая 202532,7 КБ
ReleaseFastEvent-1.18.2-1.1.1.jar1.18.2Forge14 мая 202532,8 КБ
ReleaseFastEvent-1.19.2-1.1.1.jar1.19.2Forge14 мая 202532 КБ
ReleaseFastEvent-1.20.1-1.1.1.jar1.20.1Forge14 мая 202532 КБ
ReleaseFastEvent-1.16.5-1.1.0.jar1.16.5Forge25 апреля 202532,7 КБ
ReleaseFastEvent-1.18.2-1.1.0.jar1.18.2Forge25 апреля 202532,7 КБ
ReleaseFastEvent-1.19.2-1.1.0.jar1.19.2Forge25 апреля 202532 КБ
ReleaseFastEvent-1.20.1-1.1.0.jar1.20.1Forge25 апреля 202532 КБ
Пожалуйста авторизуйтесь, чтобы оставить свой комментарий.