我有一個評估樹類。每個節點都有嚴格順序的子節點。一個服務器有一個這樣的樹的列表。快速評估樹
當客戶端成功連接到服務器時,它發出了很多不同的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