用Java设计高性能状态机

用Java设计高性能状态机,java,performance,fsm,Java,Performance,Fsm,我正在着手编写一个Java库来实现高性能有限状态机。我知道有很多库,但我想从头开始编写自己的库,因为几乎所有库都构造了优化的自动机,每次只处理一个 我想知道,在实现这样的高性能库时,SO社区中那些涉足状态机设计的人认为最重要/最好的设计原则是什么 注意事项 生成的自动机通常不是大型的。(~100-500个州) 不过,实现应该能够扩展 实现应支持快速转换(最小化、确定化等) 希望实现DFA、NFA、GNFA、PDA,可能还有树自动机。如果可能的话,希望在单一界面下 应该在内存使用和性能之间保持良好

我正在着手编写一个Java库来实现高性能有限状态机。我知道有很多库,但我想从头开始编写自己的库,因为几乎所有库都构造了优化的自动机,每次只处理一个

我想知道,在实现这样的高性能库时,SO社区中那些涉足状态机设计的人认为最重要/最好的设计原则是什么

注意事项

  • 生成的自动机通常不是大型的。(~100-500个州)
  • 不过,实现应该能够扩展
  • 实现应支持快速转换(最小化、确定化等)
  • 希望实现DFA、NFA、GNFA、PDA,可能还有树自动机。如果可能的话,希望在单一界面下
  • 应该在内存使用和性能之间保持良好的平衡
  • 目前关于我的设计问题有:

  • 是否应定义
    状态
    符号
    转换
    的类?或者应该使用“隐藏”的内部结构。就我个人而言,我觉得这样使用类会浪费大量内存,因为相同的信息可以以更精简的形式存储。但是,这能实现更快的转换吗?它还有其他的优点/缺点吗

  • 内部存储数据的最佳方式是什么?使用诸如
    HashMap
    HashSet
    之类的数据结构可以实现摊销常量时间查找,但其中涉及到一定的开销。这是最好的方式吗?将转换信息存储为基元(或非基元)数组似乎浪费了大量内存。尤其是当图书馆一次需要处理许多自动装置时。不同数据结构的优缺点是什么


  • 我感谢你的任何意见。谢谢

    那么您希望它的速度有多快?brics.dk/automaton上的代码确实声明了自己的状态和转换类,尽管很明显,这些可以使用原语重写(见鬼,整个转换类的状态显然可以轻松地适应
    长的

    例如,如果您将
    转换
    类移动到一个简单的原语,那么您就不再被迫使用缓慢的
    HashMap
    默认Java集合:您可以使用像Trove的
    TLongObjectHashMap
    (或
    TLongInt
    …或
    TLongLong
    之类的库哪个拥有默认的
    HashMap
    big times(当您使用原语时,Trove库基本上提供了超高效、快速和小型的映射和集:您不会生成无数垃圾,也不会不断地围绕原语进行不必要的包装,因此GC等更少。如果您对性能感兴趣,那么您确实希望检查Trove…并且他们即将发布的3.0版本比其他版本快20%。)Trove 2.0)

    但它真的有用吗?显然,这个库已经足够快了。毫无疑问,通过不浪费地创建对象和使用确实表现良好的集合,它可以变得更快,但目前还不清楚这是否是可取的

    除此之外,我非常确定上面的库不是线程安全的。状态构造函数通过以下操作创建唯一ID:

    static int next_id;
    .
    .
    .
    id = next_id++;
    
    这个构造函数是从90个不同的地方调用的

    在多线程场景中,创建唯一ID的方法的教科书示例(见鬼,即使将
    下一个ID
    设置为volatile也不够,比如说,这里需要一个原子整数)。我对库不太了解,但这个ID对我来说看起来很可疑。

    我有一些问题:

    • 您需要快速完成哪些部分,FSA的输入、FSA的构建还是FSA的执行

    • FSA的输入从何而来?人类输入的是状态和圆弧,还是某种自动过程?真正的输入来自转换为FSA的正则表达式

    • 金融服务管理局多久能改变一次?每秒一次?每年一次

    你知道你需要什么。除了学术上的图灵机,我从未见过一个重要的状态机不是从文本表示开始的,无论是作为正则表达式还是结构化程序

    在我处理过的每一种情况下,首选的实现都是将正则表达式直接转换为简单的结构化程序并进行编译。
    没有比这更快的了。

    嗨,也许你可以用我的professors实现作为参考。它是基于DFA和NFA的开源。实现:性能基准:@lasseSpeholt-Lol,我实际上已经有了代码,我正在处理它。这是我发现的唯一一个真正在ac中的Java库tive开发。向你的教授表示感谢和问候!你想过在Drools中使用状态规则会话吗?感谢你提供的信息,特别是在Trove中,我一定会看一看。就速度而言,越快越好,只要转换速度不受影响。我一直在玩Trove、 这些集合速度非常快。感谢链接!@Nico Huysaman:啊哈,很好:)它们的生成方式也非常酷:它们基本上使用预处理器/代码生成器,因此不必为所有基本类型复制Java代码。1)真正需要快的是在自动机上完成任何转换(确定、最小化等)。2)99.9%由随机发生器生成。3) 如果你说的是转换,我会说一秒钟一次,而不是一年一次。@Nico:那么我要做的就是在最简单的基础上对这些转换算法进行原型化