2015-04-07 64 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