首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化此事件系统

优化此事件系统
EN

Stack Overflow用户
提问于 2015-01-13 17:21:25
回答 1查看 194关注 0票数 1

因此,我正在重新工作我的事件系统,我想使它尽可能优化。我把这个降低到了82毫秒,可以引发100万起事件。我想问你是否有什么不同的做法,以及如何进一步优化这一点?目前,当一个事件被激发到该方法时,只有一些基本的逻辑正在完成,当我计划将其用于即将到来的项目时,它将更高级一些,这可能会使执行时间增加一倍。

代码语言:javascript
运行
复制
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时,有没有一种加快速度的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-13 17:31:43

你可以避免

代码语言:javascript
运行
复制
 if(entry.getKey().equals(event.getClass())) {

通过使用

代码语言:javascript
运行
复制
private final Map<Class<?>, List<EventHandle>> eventHandlerMap = new HashMap<>();

查看我的EventSystem代码

EventSource with Map, List> without unchecked call

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27927858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档