我有一个评估树类。每个节点都有严格顺序的子节点。一个服务器有一个这样的树的列表。快速评估树
当客户端成功连接到服务器时,它发出了很多不同的HashMaps
的用于计算所选树。典型的HashMap
s有成对:[变量字符串名称,变量int值]。
每个TreeNode
具有复杂的条件,这可以读取变量和具有诸如操作AND,OR,XOR,与其他变量或数字进行比较。每个TreeNode
也有语句,可以读/写变量,并把新的变数HashMap
s,这随后可以读/写在另一TreeNode
。
这里是树木的简化结构:
public static class TreeNode {
public static abstract class Condition {
public abstract boolean evaluate(HashMap<String, Integer> contex);
}
public static abstract class Statement {
public abstract void execute(HashMap<String, Integer> contex);
}
private Condition condition;
private List<Statement> statements;
private List<TreeNode> children;
public void run(final HashMap<String, Integer> contex) {
if (condition != null && !condition.evaluate(contex)) {
return;
}
for (final Statement statement : statements) {
statement.execute(contex);
}
for (final TreeNode child : children) {
child.run(contex);
}
}
}
我的当前代码上执行一个Intel I7 u3517用于与100个节点树,并用10个变量的输入HashMap
大约200000次迭代/秒。我如何加快速度?
您提供的代码没有提供任何明显的性能改进机会。与任何性能问题一样,您应该剖析程序的某些执行情况,以评估哪些部分实际上会让您放慢速度。不要忽视GC所消耗的时间。 –
“陈述”和“条件”是如何构建的?有没有优化的空间?根据“HashMap”的内容和/或对象的状态(例如“Statement”之一中的字段),是否使用了任何键?树是否被修改过?我没有看到任何修改任何“条件”和“语句”和树的优化空间。但如果有一些限制... – fabian
@fabian,'Statement'和'Condition's像二叉树一样构造。例如,条件“x == 3和y <5”由3个节点组成:1个节点检查(x == 3),1个节点检查(y <5)和1个父节点,调用'evaluate'方法的孩子,并与。同样,“陈述”与“x = 3 + y * 5”一起工作。当客户使用它时,树在计算过程中不能被修改。 – Kabanov