[FilterScript] a_cmd, procesador de comandos muy rapido
#1

Include
Procesador de comandos
"a_cmd.inc" para Pawn
- Contenidos
  • El "include" en sн.
    • Una pequeсa definiciуn.
    • Comparaciуn de velocidades.
  • Su uso
    • Sus "callbacks".
    • Forma de uso.
  • Cуdigo
    • El cуdigo fuente en PAWN del "include"

-- Una pequeсa definiciуn --
Basicamente, un procesador de comandos es un "script" que sirve para hacer que la tarea de reconocimiento de un comando basado en PAWN sea mбs rбpido que la forma convencional. Los mбs conocidos son "y_commands" por su creador ser uno de los mas activos en publicaciones del foro. Tambiйn esta "zcmd" que es mas rбpido que el primero segъn los "tests" de velocidad que he hecho. Este no se queda atrбs con velocidades muy similares a el ъltimo mencionado e incluso mejores.
-- Comparaciуn de velocidades --
El "test" comparativo se hizo con 3 procesadores de comandos. Estos fueron "y_commands", "zcmd" y "a_cmd", resultando en "zcmd" como el mбs rбpido con un dнgito mнnimo sobre "a_cmd" mientras que "y_commands" se quedу atras por mucho. Los tiempos en procesar 10.000 comandos fueron los siguientes:
  1. A_CMD v0.1
    1. 318
    2. 289
    3. 303
    4. 272
    5. 273
  2. ZCMD v0.3.1
    1. 297
    2. 318
    3. 310
    4. 319
    5. 304
  3. Y_COMMANDS v0.1.4
    1. 385
    2. 362
    3. 373
    4. 358
    5. 395
Se hicieron 5 "tests" con cada uno de los "includes". Como aprecian, "a_cmd" fuй el con mayor rendimiento seguido de "zcmd", mientras que "y_commands" se queda a una distancia exagerada.
-- Sus "callbacks" --
Usa 3 "callbacks" mientras que crea 2 de estos.
OnPlayerCommandUse(playerid, cmdtext[], bool:existe)Callback
  • playerid
    • jugador que usa el comando
  • cmdtext[]
    • comando usado
  • bool:existe
    • true = el comando existe
    • false = el comando no existe
Callback
  • playerid
    • jugador que usa el comando
  • cmdtext[]
    • comando usado
-- Forma de uso --
Su uso es bastante simple, parecido a los 2 anteriormente mencionados.
pawn Код:
new bool:var, c;

CMD:comando2(playerid)
{
    //Comando sin parбmetros
   
    if(var != false) return SendClientMessage(playerid, -1, "Usa /comando");
   
    //Resto del cуdigo
    print("Usado correctamente");
    var = true;
    c++;
   
    return 1;
}

CMD:comando(playerid, parametros[])
{
    //Comando con parбmetros
   
    //Si no ingresa parбmetros
    if(isnull(parametros)) return SendClientMessage(playerid, -1, "Ingrese parбmetros");
   
    if(var != true) return SendClientMessage(playerid, -1, "Usa /comando2");
   
    //Resto del cуdigo
    print("Usado correctamente");
    var = false;
    c++;
   
    return 1;
}

public OnPlayerCommandB(playerid, cmdtext[])
{
    if(c > 10) return SendClientMessage(playerid, -1, "Esos comandos solo puedes usarlo un mбximo de 10 veces");
   
    return 1;
}
public OnPlayerCommandUse(playerid, cmdtext[], bool:existe)
{
    //Existencia de un comando
    if(existe != true) return SendClientMessage(playerid, -1, "Ese comando no exise");
   
    return 1;
}
-- El cуdigo fuente en PAWN del "include" --
Si te preguntas que estarб dentro de este funcionamiento tan уptimo, aquн esta el cуdigo fuente.
pawn Код:
/*******************************************************************************

    DesingMyCry
    Shyny
                A_CMD
                    PROCESADOR DE COMANDOS
                   
                v0.1 - 25 04 2013

*******************************************************************************/


#include <a_samp>

#if defined _acmd_included
    #endinput
#endif
#define _acmd_included

#define COMMAND:%1(%2)          \
            forward c_%1(%2); \
            public c_%1(%2)

#define CMD:%1(%2) \
            COMMAND:%1(%2)

#define command(%1,%2,%3) \
            COMMAND:%1(%2, %3)

#define cmd(%1,%2,%3) \
            COMMAND:%1(%2, %3)

#if !defined isnull
    #define isnull(%1) \
                (%1[0] == '#')
#endif

#define MAX_CMD_LEN 32

forward OnPlayerCommandB(playerid, cmdtext[]);
forward OnPlayerCommandUse(playerid, cmdtext[], bool:existe);

public OnPlayerCommandText(playerid, cmdtext[])
{
    CallLocalFunction("OnPlayerCommandB", "is", playerid, cmdtext);
    new e, bool:ex=false, exi, cmdtext_[MAX_CMD_LEN], tcmd[MAX_CMD_LEN];
    strcat(cmdtext_, cmdtext[1], sizeof cmdtext_);
    for(new l = 0; l < strlen(cmdtext_); l++)
    {
        if(cmdtext_[l] == ' '){ e = l; ex=true; strdel(cmdtext_, l, MAX_CMD_LEN+1); break;}
    }
    format(tcmd, sizeof tcmd, "c_%s", cmdtext_);
    if(ex != false){ exi = CallLocalFunction(tcmd, "is", playerid, cmdtext[e+2]); }
    else{ exi = CallLocalFunction(tcmd, "is", playerid, "#"); }

    switch(exi)
    {
        case 0: CallLocalFunction("OnPlayerCommandUse", "isb", playerid, cmdtext, false);
        default: CallLocalFunction("OnPlayerCommandUse", "isb", playerid, cmdtext, true);
    }
   
    return 1;
}

#if defined _ALS_OnPlayerCommandText
    #undef OnPlayerCommandText
#else
    #define _ALS_OnPlayerCommandText
#endif
#define OnPlayerCommandText acmd_OnPlayerCommandText
forward acmd_OnPlayerCommandText(playerid, cmdtext[]);
Velocidades (test comparado con zcmd)
zcmd:

Quote:

- 22944 milisegundos en la prueba: 0
- 21712 milisegundos en la prueba: 1
- 21645 milisegundos en la prueba: 2
- 21691 milisegundos en la prueba: 3
- 21734 milisegundos en la prueba: 4
- 21746 milisegundos en la prueba: 5
- 21601 milisegundos en la prueba: 6
- 21786 milisegundos en la prueba: 7
- 21777 milisegundos en la prueba: 8
- 21877 milisegundos en la prueba: 9

a_cmd:

Quote:

- 22601 milisegundos en la prueba: 0
- 21059 milisegundos en la prueba: 1
- 21083 milisegundos en la prueba: 2
- 21279 milisegundos en la prueba: 3
- 21043 milisegundos en la prueba: 4
- 21126 milisegundos en la prueba: 5
- 21136 milisegundos en la prueba: 6
- 21147 milisegundos en la prueba: 7
- 21194 milisegundos en la prueba: 8
- 21123 milisegundos en la prueba: 9

El Test fue hecho a 1,000,000 de iteraciones por diez repeticiones.

Script de prueba para hacer test
pawn Код:
#include <a_samp>
#include <a_cmd>

// Script para test de velocidad de ShinyDavid.

#define ITERACIONES  1000000
#define REPETICIONES 10
new Tiempos[REPETICIONES];

public OnGameModeInit()
{
    for(new z=0;z<REPETICIONES;z++)
    {
        Tiempos[z] = GetTickCount();
        for(new y=0;y<ITERACIONES;y++)
        {
            CallRemoteFunction("OnPlayerCommandText","is",0,"/comando1 0 param1");
        }
        printf("- %d milisegundos en la prueba: %d",GetTickCount()-Tiempos[z],z);
    }
    return 1;
}

public OnPlayerCommandText(playerid,cmdtext[])
{
    return 0;
}

//================================= Comando ====================================
CMD:comando1(playerid,params[])
{
    return 1;
}
// =============================================================================
-- Crйditos --
  • DesingMyCry 100% codificacion, creacion del post, test.
  • ShinyDavid 100% codigo del test y hacer nada.
  • SA-MP Team funciones nativas
Reply
#2

o.o, nada mal C:
Reply
#3

Muy buйn procesador de comandos, no creo que ese test de velocidad sea correcto ya que YCMD es mбs rбpido que ZCMD, recuerde que YCMD depende de varias librerias YSI lo cuбl ayuda en su optimizaciуn.

Un saludo.
Reply
#4

Por ahн usу el YCMD viejo, ya que hace unos pocos dнas fue actualizado, hasta йsta actualizaciуn, ZCMD seguнa siendo mejor, pero en йsta ъltima actualizaciуn, YCMD lo superу.
Reply
#5

esos son los datos que me dio el creador, cuando pueda hago yo un test aun que no creo que varie mucho la diferencia entre todos.

Saludos.
Reply
#6

Vale, cuando hagas eso SD, estarнa bueno que lo compares (si querйs) no sуlo con ycmd y zcmd, si no que tambiйn que con dcmd, que varios lo usan.
Reply
#7

Se ve bueno, pero como uso un comando?
Reply
#8

Quote:
Originally Posted by Matyaas
Посмотреть сообщение
Se ve bueno, pero como uso un comando?
es practicamente iguala a zcmd y y_cmd, con la exepcion de que y_cmd tiene la funcion help en sus comandos.
Reply
#9

Post actualizado.
Reply
#10

Quote:
Originally Posted by oOFotherOo
Посмотреть сообщение
Muy buйn procesador de comandos, no creo que ese test de velocidad sea correcto ya que YCMD es mбs rбpido que ZCMD, recuerde que YCMD depende de varias librerias YSI lo cuбl ayuda en su optimizaciуn.

Un saludo.
Al contrario, eso hace que sea mas lento.

Quote:
Originally Posted by DeadSkyTkb
Посмотреть сообщение
Por ahн usу el YCMD viejo, ya que hace unos pocos dнas fue actualizado, hasta йsta actualizaciуn, ZCMD seguнa siendo mejor, pero en йsta ъltima actualizaciуn, YCMD lo superу.
El hilo ya se actualizу con mas informaciуn, tambiйn aparecen las versiones de los 3 procesadores.

Por otro lado, Shiny cambiу los crйditos, estan las mismas personas pero de otra forma
Tambiйn si aprecian, en la parte de velocidad me contradigo diciendo que "zcmd" es mas rбpido, y luego digo que "a_cmd" es mas rбpido. Eso ocurriу ya que al momento de escribir el anterior hilo, le dije al creador de este unas velocidades que recordaba, y obviamente estaban mal. Ahi ya habia creado el "post" y despues no notй de ese error para decirle a Shiny y modificarlo. Bueno, detalles

Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)