2015-04-07 1 views
1

J'ai une classe d'arbre d'évaluation. Chaque noeud a des enfants dans un ordre strict. Un serveur a une liste de ces arbres.Evaluation rapide de l'arborescence

Lorsqu'un client se connecte avec succès au serveur, il envoie beaucoup de différents HashMaps à un arbre sélectionné pour le calcul. Les types HashMap ont des paires: [nom de la chaîne variable, valeur de la variable int].

Chaque TreeNode a une condition complexe, qui peut lire des variables et a des opérations telles que AND, OR, XOR, en les comparant à d'autres variables ou nombres. Chaque TreeNode a également des instructions, qui peuvent lire/écrire des variables et mettre de nouvelles variables à HashMap s, qui peuvent ensuite être lus/écrits dans un autre TreeNode.

Voici une structure simplifiée des arbres:

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); 
     } 
    } 
} 

Mon code effectue actuellement environ 200000 itérations/s sur un Intel Core i7 u3517 pour un arbre avec 100 noeuds et une entrée HashMap avec 10 variables. Comment puis-je l'accélérer?

+0

Le code que vous avez présenté n'offre aucune possibilité évidente d'amélioration des performances. Comme pour tout problème de performance, vous devez présenter certaines exécutions du programme pour évaluer quelles parties vous ralentissent réellement. Ne négligez pas le temps consommé par le GC. –

+0

Comment les 'Statement's et' Condition's sont-ils construits? Y a-t-il de la place pour l'optimisation? L'une des clés est-elle utilisée en fonction du contenu de 'HashMap' et/ou de l'état d'un objet (par exemple un champ dans l'un des' Statement's)? L'arbre est-il déjà modifié? Je ne vois aucune marge d'optimisation pour les 'Condition's et' Statement's arbitraires et les arbres qui sont modifiés. Mais s'il y a quelques restrictions ... – fabian

+0

@fabian, 'Statement's et' Condition's sont construits comme des arbres binaires. Par exemple, la condition "x == 3 et y <5" consiste en 3 nœuds: 1 vérifications de nœud (x == 3), 1 vérifications de nœud (y <5) et 1 nœud, qui est parent, appelle les méthodes 'evaluate' de ses enfants et faire ET. De même, 'Statement' travail avec" x = 3 + y * 5 ". L'arbre ne peut pas être modifié pendant le calcul, quand le client l'utilise. – Kabanov

Répondre

0

Si vos instructions et vos enfants peuvent être exécutés en parallèle et que vous utilisez Java 8, vous pouvez utiliser parallelStream().

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

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

Eh bien oui, ou il pourrait être parallélisé différemment dans les versions antérieures de Java. Cependant, je prends l'accent de l'OP sur «l'ordre strict» des nœuds d'enfant comme une indication qu'ils doivent être évalués en série. –

+0

@JohnBollinger - D'accord - et je serais certainement favorable à votre suggestion de mesurer avant de couper. Peut-être que seules les déclarations vont paralléliser. – OldCurmudgeon