用Java设计高性能状态机
我正在开始编写Java库来实现高性能的有限状态机。我知道那里有很多库,但是我想从头开始编写自己的库,因为几乎所有的库都构建了自动机,这些自动机被优化为一次只处理一个。
我想知道SO社区中涉及状态机设计的人员在实现像这样的高性能库时最重要/最好的设计原则是什么。
注意事项
生成的自动机通常不是很大的。 (约100-500州)。
实现应该能够扩展。
实现应该能够实现快速转换(最小化,确定等)。
希望实施DFA,NFA,GNFA,PDA和可能的Tree Automata。希望在可能的情况下在单一界面下。
应该在内存使用和性能之间取得良好的平衡。
目前关于设计的当前问题是:
是否应该定义
State
,Symbol
和Transition
的类?或者应该使用“隐藏的”内部结构。我个人认为使用类本会浪费大量内存,因为相同的信息可以以更加浓缩的形式存储。但是,这是否可以实现更快的转换?它是否有任何其他优点/缺点?
在内部存储数据的最佳方法是什么?使用像HashMap
和HashSet
这样的数据结构可以实现分摊的常量时间查找,但是存在一个涉及开销的元素。这是最好的方法吗?将转换信息存储为原始(或非)数组似乎浪费了相当多的内存。特别是当库需要一次处理大量自动机时。不同数据结构的优缺点是什么?
我很感激任何意见。谢谢!
没有找到相关结果
已邀请:
2 个回复
呢率篓舍烫
)。 事实上,如果你将
类移动到简单的原语,那么你就不会再被迫使用缓慢的
默认Java集合了:你可以使用像Trove的
(或
......或
,拥有默认
大时代的任何东西(Trove库基本上提供了超高效的地图和集合,无论是快速还是小,当你使用原语时:你不会生成无数垃圾,也不会不断地不必要地包裹原语,所以更少GC等。如果你正在进行表演,那么你确实要检查Trove ......而他们的3.0即将推出的版本比Trove 2.0快20%)。 但它真的有用吗?显然,图书馆已经足够快了。毫无疑问,通过不浪费地创建对象并使用实际上表现良好的集合可以更快地制作它,但不清楚它是否可取。 除此之外,我很确定上面的库不是线程安全的。 State构造函数通过执行以下操作创建唯一ID:
而那个构造函数是从... 90个不同的地方调用的! 一个不在多线程场景中创建唯一ID的方法的教科书示例(哎呀,甚至使得
不稳定是不够的,你想要这里的AtomicInteger)。我不太了解这个图书馆,但这个ID看起来非常可疑。
校勒魏寡