java - java中的高效状态机模式

标签 java performance simulation state-machine

我正在编写一个 Java 模拟应用程序,其中有很多实体要模拟。这些实体中的每一个在系统中的任何时候都具有一定的状态。对此类实体建模的一种可能且自然的方法是使用 state (or state machine)图案。问题是如果有很多状态切换,它会在运行时创建很多对象,这可能会导致系统性能下降。我有哪些设计选择?我希望性能成为继可维护性之后的主要标准。

谢谢

最佳答案

以下代码将为您提供高性能(~10ns/事件)零运行时 GC 状态机实现。只要你在系统或组件中有状态的概念,就使用显式状态机,这不仅使代码干净和可扩展,而且让人们(甚至不是程序员)立即看到系统在做什么,而不必深入研究大量回调:

abstract class Machine {
    enum State {
      ERROR,
      INITIAL,
      STATE_0,
      STATE_1,
      STATE_2;
    }

    enum Event {
      EVENT_0,
      EVENT_1,
      EVENT_2;
    }

    public static final int[][] fsm;
    static {
      fsm = new int[State.values().length][];
      for (State s: State.values()) {
        fsm[s.ordinal()] = new int[Event.values().length];
      }
    }

    protected State state = State.INITIAL;
    // child class constructor example
    // public Machine() {
    //   // specify allowed transitions
    //   fsm[State.INITIAL.ordinal()][Event.EVENT_0.ordinal()] = State.STATE_0.ordinal();
    //   fsm[State.STATE_0.ordinal()][Event.EVENT_0.ordinal()] = State.STATE_0.ordinal();
    //   fsm[State.STATE_0.ordinal()][Event.EVENT_1.ordinal()] = State.STATE_1.ordinal();
    //   fsm[State.STATE_1.ordinal()][Event.EVENT_1.ordinal()] = State.STATE_1.ordinal();
    //   fsm[State.STATE_1.ordinal()][Event.EVENT_2.ordinal()] = State.STATE_2.ordinal();
    //   fsm[State.STATE_1.ordinal()][Event.EVENT_0.ordinal()] = State.STATE_0.ordinal();
    //   fsm[State.STATE_2.ordinal()][Event.EVENT_2.ordinal()] = State.STATE_2.ordinal();
    //   fsm[State.STATE_2.ordinal()][Event.EVENT_1.ordinal()] = State.STATE_1.ordinal();
    //   fsm[State.STATE_2.ordinal()][Event.EVENT_0.ordinal()] = State.STATE_0.ordinal();
    // }

    public final void onEvent(Event event) {
      final State next = State.values()[ fsm[state.ordinal()][event.ordinal()] ];
      if (next ==  State.ERROR) throw new RuntimeException("invalid state transition");
      if (acceptEvent(event)) {
        final State prev = state;
        state = next;
        handleEvent(prev, event);
      }
    }

    public abstract boolean acceptEvent(Event event);
    public abstract void handleEvent(State prev, Event event);
}

如果将 fsm 替换为大小为 S*E 的单维数组,它还将改善状态机的缓存邻近特性。

关于java - java中的高效状态机模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13177347/

相关文章:

c# - 托管在 Windows 服务中的 WCF 服务运行速度比控制台应用程序慢 10 倍

python - 寻找交叉点

sql-server - 为什么我的 Sql 查询在第二次运行时更快?

c++ - 模拟以退出代码 : 132 终止

python - 多处理策略-共享嵌套对象

algorithm - SPH流体-内核导数

java - 它的用途 <sf :errors path ="" cssClass ="error"> in jsp?

java - 如何从 android 中的 arraylist 获取 null

Java继承问题

java - 如果提供的登录信息错误,为什么控件不在其他部分和 Toast 中?