Plugin Résolu Question à propos des Events

Fau8

Architecte en herbe
20 Février 2017
169
1
10
126
Bonjour, bonsoir, je me pose une question depuis un petit moment et j'aurai besoin de l'avis d'autres développeurs.
Si au lieu d'utiliser plusieurs fois le même Event pour des conditions différentes (ou dans des class différentes), on regroupe toutes les conditions liées à cet Event dans un seul Event, est-ce cela optimiserait le plugin, ou l'inverse, ou ça n'impacterait rien du tout ?

Fau8,
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Je vais te faire un pseudo code du système d'event (j'ai jamais été vérifié mais normalement c'est comme ça que c'est implémenté).

Pour pouvoir écouter des events tu dois dire à Bukkit les class qui vont faire cela. Le fameux "RegisterEvents": https://hub.spigotmc.org/javadocs/s...kkit.event.Listener-org.bukkit.plugin.Plugin-

Du côté serveur il va avoir une sorte de liste (peut importe la structure exacte, l'idée est la) de toutes les classes qui écoutent.
Lorsqu'un event va être "émit", bukkit (ou spigot, bref, on a compris) va parcourir la liste et va dire "coucou, j'ai tel event qui c'est déclenché". Le code que tu as écrit lié à cet event va être exécuté.

Maintenant, coté performance. En informatiques on compte en "grand O de". Donc, pour résumé cette mesure, le code suivant à une complexité de "O(n)":
Java:
for(int i = 0; i < n; ++i) {
    // Du code
}
C'est "n" qui définit le nombre de boucle. Si maintenant tu as:
Java:
for(int i = 0; i < n; ++i) {
    for(int j = 0; j < n; ++j) {
         // Du code
    }
}
On dit que la complexité est de O(n^2)
Et logiquement:
Java:
for(int i = 0; i < n; ++i) {
    // Du code
}

for(int i = 0; i < n; ++i) {
    // Du code
}
Ceci donne O(2n).

Chaque opération peut être "estimé" mais on simplifie ensuite le tout. On part du principe que faire une assignation c'est "une" opération et que du coup c'est négligeable. Si dans la première boucle que j'ai écrit on fait un tri de "n" éléments, la complexité sera beaucoup plus élevé que O(n). Si le tri n'est pas optimisé on peut même arrivé à O(n^2).

Maintenant qu'on a tout ça, évaluons ta solution.
Pour "n" événement déclaré à bukkit, la complexité est de O(n). Si maintenant tu ne défini qu'un seul event, tu va retomber à O(1). (vu que n = 1).

Oui... Mais non...
En fait la on ne prend que la complexité de la boucle... On ne prend pas en compte la complexité de ton code. Imaginons que dans ton code tu fasse une boucle qui vérifie des propriéts des joueurs. Nommons le nombre de joueur "p".
On a donc une complexité de O(n*p). Si maintenant tu met tout dans une fonction. Et bien soit tu sais mettre ensemblent toutes les boucles et du coup ça fait O(p), soit tu ne sais pas et tu va devoir copié/collé ton code "à la suite" dans ta fonction. Comme tu avais "n" event, tu va devoir faire "n" copié/collé et te retrouver avec "n" fois la boucle "p"... Et donc O(n*p).

Si tu veux une réponse courte à ta question: concrètement ça ne va rien changé (ou très peu). Le seul cas où cela va être avantageux c'est si tu exécute le même code dans chacun de tes events (mais ça normalement tu l'as déjà évité car un programmeur est fainéant et ne développe jamais 2 fois le même code (il réutilise ce qu'il a déjà fait ;) )).


Cordialement,
Detobel36
 

Fau8

Architecte en herbe
20 Février 2017
169
1
10
126
Salut,

Je vais te faire un pseudo code du système d'event (j'ai jamais été vérifié mais normalement c'est comme ça que c'est implémenté).

Pour pouvoir écouter des events tu dois dire à Bukkit les class qui vont faire cela. Le fameux "RegisterEvents": https://hub.spigotmc.org/javadocs/s...kkit.event.Listener-org.bukkit.plugin.Plugin-

Du côté serveur il va avoir une sorte de liste (peut importe la structure exacte, l'idée est la) de toutes les classes qui écoutent.
Lorsqu'un event va être "émit", bukkit (ou spigot, bref, on a compris) va parcourir la liste et va dire "coucou, j'ai tel event qui c'est déclenché". Le code que tu as écrit lié à cet event va être exécuté.

Maintenant, coté performance. En informatiques on compte en "grand O de". Donc, pour résumé cette mesure, le code suivant à une complexité de "O(n)":
Java:
for(int i = 0; i < n; ++i) {
    // Du code
}
C'est "n" qui définit le nombre de boucle. Si maintenant tu as:
Java:
for(int i = 0; i < n; ++i) {
    for(int j = 0; j < n; ++j) {
         // Du code
    }
}
On dit que la complexité est de O(n^2)
Et logiquement:
Java:
for(int i = 0; i < n; ++i) {
    // Du code
}

for(int i = 0; i < n; ++i) {
    // Du code
}
Ceci donne O(2n).

Chaque opération peut être "estimé" mais on simplifie ensuite le tout. On part du principe que faire une assignation c'est "une" opération et que du coup c'est négligeable. Si dans la première boucle que j'ai écrit on fait un tri de "n" éléments, la complexité sera beaucoup plus élevé que O(n). Si le tri n'est pas optimisé on peut même arrivé à O(n^2).

Maintenant qu'on a tout ça, évaluons ta solution.
Pour "n" événement déclaré à bukkit, la complexité est de O(n). Si maintenant tu ne défini qu'un seul event, tu va retomber à O(1). (vu que n = 1).

Oui... Mais non...
En fait la on ne prend que la complexité de la boucle... On ne prend pas en compte la complexité de ton code. Imaginons que dans ton code tu fasse une boucle qui vérifie des propriéts des joueurs. Nommons le nombre de joueur "p".
On a donc une complexité de O(n*p). Si maintenant tu met tout dans une fonction. Et bien soit tu sais mettre ensemblent toutes les boucles et du coup ça fait O(p), soit tu ne sais pas et tu va devoir copié/collé ton code "à la suite" dans ta fonction. Comme tu avais "n" event, tu va devoir faire "n" copié/collé et te retrouver avec "n" fois la boucle "p"... Et donc O(n*p).

Si tu veux une réponse courte à ta question: concrètement ça ne va rien changé (ou très peu). Le seul cas où cela va être avantageux c'est si tu exécute le même code dans chacun de tes events (mais ça normalement tu l'as déjà évité car un programmeur est fainéant et ne développe jamais 2 fois le même code (il réutilise ce qu'il a déjà fait ;) )).


Cordialement,
Detobel36
Merci pour ces réponses, je m'en doutais un peu (vu que tout les plugins font ça). J'ai appris quelque chose en plus :p

Bonne soirée.
Cordialement,
Fau8