java - 优化本次 Activity 系统

标签 java events system

所以我正在重新设计我的事件系统,我希望尽可能优化它。我将触发 100 万个事件的时间减少到大约 82 毫秒。我想问一下您是否有什么不同的做法以及如何进一步优化?目前,当事件被触发到该方法时,仅完成一些基本逻辑,当我计划将其用于即将到来的项目时,它将更高级一点,这可能会使执行时间加倍。

package me.xerces.eventbus;

import me.xerces.eventbus.annotation.EventHandler;
import me.xerces.eventbus.event.Event;

import java.lang.invoke.MethodHandle;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;

public class EventManager {

    private ArrayList<Map.Entry<Class, EventHandle>> eventHandlerList = new ArrayList<Map.Entry<Class, EventHandle>>();

    public void addEventListener(Object object)
    {
        for(Method method : object.getClass().getDeclaredMethods())
        {
            if(method.isAnnotationPresent(EventHandler.class))
            {
                Map.Entry<Class, EventHandle> eventHandleEntry = new AbstractMap.SimpleEntry<Class, EventHandle>(method.getParameterTypes()[0], new EventHandle(method, object));
                method.setAccessible(true);
                eventHandlerList.add(eventHandleEntry);
            }
        }
    }

    public void addSpecificEventListener(Object object, Class eventClass)
    {
        for(Method method : object.getClass().getDeclaredMethods())
        {
            if(method.isAnnotationPresent(EventHandler.class) && method.getParameterTypes().length > 0 && method.getParameterTypes()[0].equals(eventClass))
            {
                Map.Entry<Class, EventHandle> eventHandleEntry = new AbstractMap.SimpleEntry<Class, EventHandle>(method.getParameterTypes()[0], new EventHandle(method, object));
                method.setAccessible(true);
                eventHandlerList.add(eventHandleEntry);
            }
        }
    }

    public void removeEventListener(Object object)
    {
        Iterator<Map.Entry<Class, EventHandle>> iterator = eventHandlerList.iterator();
        while(iterator.hasNext())
        {
            Map.Entry<Class, EventHandle> entry = iterator.next();
            if(entry.getValue().getMethodClass().equals(object))
                iterator.remove();
        }
    }

    public void fireEvent(Event event)
    {
        Iterator<Map.Entry<Class, EventHandle>> iterator = eventHandlerList.iterator();
        while(iterator.hasNext())
        {
            Map.Entry<Class, EventHandle> entry = iterator.next();
            if(entry.getKey().equals(event.getClass())) {
                try {
                    EventHandle eventHandle = entry.getValue();
                    eventHandle.getMethod().invoke(eventHandle.getMethodClass(), event);
                } catch (IllegalAccessException | InvocationTargetException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

Github链接:https://github.com/X3rces/EventBus 编辑:当 JVM 将调用转换为直接方法调用而不是使用 JNI 时,有没有办法加快速度?

最佳答案

你可以避免

 if(entry.getKey().equals(event.getClass())) {

通过使用

private final Map<Class<?>, List<EventHandle>> eventHandlerMap = new HashMap<>();

查看我的有问题的 EventSystem 代码

EventSource with Map<Class<? extends Event>, List<EventListener<? extends Event>> without unchecked call

关于java - 优化本次 Activity 系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27927858/

相关文章:

c# - 我无法摆脱System.Range.get_Start错误

perl - Perl-如果系统命令失败或运行时间过长,如何停止它或运行另一个系统调用?

java - 通过对值求和将 map 列表合并为单个 map

java - 检查对象是否是通用父类的实例

jQuery 点击一个元素,Child 会干扰

delphi - 修改 Windows 7 预览 Pane 以显示文件夹的子目录而不是大的空框

java - 使用递归将句子逐字添加到集合中

java - 不同操作系统下服务器mysql中的数据库 'mysql'

javascript - 在执行所有当前计划的回调后调用函数( Node )

ios - 什么是 UITouchPhase?