2015-04-07 52 views
1

我有一个评估树类。每个节点都有严格顺序的子节点。一个服务器有一个这样的树的列表。快速评估树

当客户端成功连接到服务器时,它发出了很多不同的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次迭代/秒。我如何加快速度?

+0

您提供的代码没有提供任何明显的性能改进机会。与任何性能问题一样,您应该剖析程序的某些执行情况,以评估哪些部分实际上会让您放慢速度。不要忽视GC所消耗的时间。 –

+0

“陈述”和“条件”是如何构建的?有没有优化的空间?根据“HashMap”的内容和/或对象的状态(例如“Statement”之一中的字段),是否使用了任何键?树是否被修改过?我没有看到任何修改任何“条件”和“语句”和树的优化空间。但如果有一些限制... – fabian

+0

@fabian,'Statement'和'Condition's像二叉树一样构造。例如,条件“x == 3和y <5”由3个节点组成:1个节点检查(x == 3),1个节点检查(y <5)和1个父节点,调用'evaluate'方法的孩子,并与。同样,“陈述”与“x = 3 + y * 5”一起工作。当客户使用它时,树在计算过程中不能被修改。 – Kabanov

回答

0

如果你的语句和孩子可以并行运行,您使用的是Java 8,你可以使用parallelStream()

 statements.parallelStream().forEach((statement) -> { 
      statement.execute(contex); 
     }); 

     children.parallelStream().forEach((child) -> { 
      child.run(contex); 
     }); 
+0

嗯,是的,或者它可以在早期版本的Java中进行不同的并行化。但是,我认为OP的重点是子节点的“严格顺序”,作为它们必须连续评估的指示。 –

+0

@JohnBollinger - 同意 - 我肯定会支持你的建议,在裁剪之前进行测量。也许只有这些陈述才会平行。 – OldCurmudgeon