Comparer : les processeurs de commandes
#1

Yooooo !

C'est un truc assez amusant les comparatifs (surtout dans ce sous forum parce que зa part trиs trиs vite en couilles, allez savoir pourquoi) mais je tente quand mкme ma chance avec ce sujet : les processeurs de commande.

Actuellement, j'en comparerai 5 car c'est ceux que je considиre comme les mieux codйs, chacun essayant de se dйmarquer des autres en ajoutant des fonctionnalitйs ou en changeant la syntaxe pour un gain de vitesse.

DCMD (de Dracoblue, 200
ZCMD (de Zeex, 2009)
YCMD (de Y_Less, 2010)
rCMD (de RyDeR`, 2012)
mCMD (de Mellnik, 2014)


Pour commencer, une courte prйsentation de chacun des systиmes :

• DCMD : le plus ancien des processeurs de commande jamais crйй (а part via OnPlayerCommandText, existant depuis SAMP 0.2). Chiant а йcrire, mais moins chiant qu'avec strcmp. Long а exйcuter, mais moins long qu'avec un combo strcmp + strtok.

• ZCMD : Probablement le processeur de commande le plus rapide (malgrй ce qu'en disent certains avec de la notoriйtй, comme Y_Less) sur SAMP. Assez ancien mais toujours fonctionnel. Facile а йcrire, rapide а exйcuter, ce qui en fait un processeur de commande assez puissant. Gйnйralement premier des tests de benchmark.

• y_commands (alias YCMD) : Un processeur de commande crйй par Y_Less, rejoignant la sйrie YSI. Il reprend globalement la base de ZCMD en y ajoutant des vйrifications et autres (ce qui me fait dire que зa ne peut pas кtre plus rapide que ZCMD). Gйnйralement classй deuxiиme des tests de benchmark, juste aprиs ZCMD.

• RCMD : Codй entiиrement en assembly par RyDeR, il est actuellement rapide mais deux fois plus lent que ZCMD. La syntaxe de la dйclaration de commande rend le code assez lent а йcrire et compliquй а comprendre. Par contre, зa ajoute une bonne gestion des paramиtres aprиs la dйclaration de la commande.

• mcmd : Je l'aborde en dernier car il y a un peu plus de choses а dire sur ce plugin. Release hier par Mellnik, ce plugin (premier processeur de commande fonctionnel via un plugin) utilise la rйtro-ingйnierie, ce qui le fera fonctionner aussi longtemps que Kalcor n'aura pas la mauvaise idйe de changer la faзon dont les commandes sont lancйes. Ce point faible, qui forcera Mellnik а le mettre а jour а chaque nouvelle version de SAMP, est aussi un point fort : зa permet aux commandes d'кtre lancйes sans AUCUNE interaction avec le pawn. C'est assez complexe а comprendre, mais disons que lorsque le code est compilй (le code contenant ce que la commande doit faire, йvidemment) et lu par le serveur, la commande est exйcutйe sans qu'OnPlayerCommandText soit appelй.

Je cite Mellnik,

Quote:
Originally Posted by Mellnik
Here are the assembly instructions from the SA-MP 0.3z R2-2 server where it calls OnPlayerCommandText.
http://i.imgur.com/veUXSa2.png
mcmd erases everything from 0x46AA17 to 0x46AA85 and places a JMP to the internal function _mcmd_opct_jmp_hook. cmdtext is located in register ebx and playerid in ebp, these are being pushed onto the stack and _mcmd_engine_detour is being called.
Ce qui donne en franзais (bah oui, j'allais pas vous laisser avec зa sous les yeux)

Quote:

Voici les instructions d'assembleur utilisйes par SAMP 0.3z R2-2 quand OnPlayerCommandText est appelйe.


mcmd efface tout depuis 0x46AA17 jusqu'а 0x46AA85 et place un JMP (?) dans la fonction interne _mcmd_opct_jmp_hook. cmdtext est localisй dans l'enregistrement ebx et playerid dans ebp. Ils seront "pushйs" (ajoutйs au sommet du stack) et _mcmd_engine_detour sera appelйe.

Ce qui garanti au plugin une vitesse d'exйcution vraiment bonne, fournissant cependant des risques de crash dus а la rйtro ingйnierie et des problиmes de compatibilitй ainsi que l'impossibilitй d'utiliser le plugin durant les trois premiers jours aprиs la release d'une nouvelle version de SAMP.

J'ai volontairement omis mcmd 1er, crйй par MrDeath537, qui reprend en gros dcmd sans y ajouter quoi que ce soit d'utile

Au niveau de la simplicitй d'йcriture, on peut classer les commandes de cette faзon :

ZCMD = YCMD = mcmd = dcmd > rCMD


Au niveau de la rapiditй d'йcriture, on peut classer les commandes de cette faзon :

ZCMD = YCMD = mcmd > dcmd ~= rcmd

Au niveau de la rapiditй d'exйcution, je prends comme base trois choses
• Ce que dit l'auteur
• Les tests de benchmark effectuйs
• Le case sensitive (si le processeur est case sensitive, il perdra des points alors que si il ne l'est pas, il en gagnera).
Plus un processeur aura de points, plus il sera classй haut.

Je prйcise quelques choses quand mкme :

• Pour YCMD et ZCMD et mcmd, les commandes ne sont pas case sensitive, mais les paramиtres le sont.
• Pour rCMD, je n'ai aucune information а ce sujet
• Pour dCMD, les paramиtres ET les noms de commande ne sont pas case sensitive

Et je serais tentй de les classer comme зa

mcmd > zcmd > ycmd > rCMD > dcmd

WHAAAAAAAAAAAAAAAAAAAAAAAAAAAT ? mcmd en premier ? c'est le plus rapide alors ??

Il semblerait oui.
Les tests effectuйs par Mellnik donnent des rйsultats qui font passer ZCMD pour une tortue (mкme si а l'йchelle humaine, zcmd est trиs trиs rapide)

Les tests ont йtй effectuйs par Mellnik (mcmd vs zcmd) avec ces conditions :

Code:
100000 rйpйtitions
+2700 commandes dans le GameMode
callbacks personelles activйes
3 commandes appelйes par rйpйtition :
(0, "/first testparams yes")
(0, "/last testparams yes")
(0, "/none testparams yes")
Et les rйsultats sont assez catйgoriques :

Code:
mcmd: 199 ms
zcmd: 626 ms + internal OnPlayerCommandText execution from the samp-server (not measured)
Couplons ce rйsultat а ceux rйalisйs par Y_Less en 2010 (les "mcmd" prйsents feront donc rйfйrence а la release de MrDeath) :

Code:
Pour 10'000 rйpйtitions avec 677 commandes par rйpйtition, les rйsultats sont (addition du temps qu'а mit le serveur pour exйcuter toutes les commandes) :

Joueur autorisй а utiliser la commande :

 ycmd: 375
  zcmd: 157
  dcmd: 11444
  mcmd: 15334
strcmp: 11154
strtok: 14856

Joueur non autorisй а utiliser la commande :

ycmd: 275
  zcmd: 157
  dcmd: 22364
  mcmd: 15338
strcmp: 11178
strtok: 14862
Et pour finir, selon ce post, rCMD est deux fois plus lent que ZCMD, ce qui justifie totalement mon classement.

Comparer la rapiditй d'accиs aux йlйments de la commande :

RCMD > zcmd = ycmd = mcmd = dcmd

Justifiй par l'accиs direct aux paramиtres de RCMD comparй а l'obligation d'utilisй sscanf sur les quatre autres.


Ce qui me fait grandement pencher vers mcmd pour sa rapiditй et sa syntaxe comparable а ZCMD et YCMD.
Donnez votre opinion а propos du moteur que vous utilisez/comptez utiliser pour vos futurs scripts !
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)