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 заменяет генерацию классов на лямбда-выражения, что даёт:
- Ускорение создания обработчиков
- Возможность дополнительной оптимизации со стороны 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;