[Tutorial] Optimizaзхes
#1


Optimizaзхes
Bem vindos a outro tutorial, neste tutorial irei ensinar algumas optimizaзхes que podemos fazer, deixando assim o seu cуdigo mais limpo e rбpido, lembrando que podemos diminuir o tamanho do amx, entгo vamos lб.

Arrays
Normalmente quando nуs criamos arrays podemos torna-las globais ou locais, eu antigamente usava sу arrays locais, pois pensava que seria mais optimizado, mas foi ai que eu pensei, para que й que vou usar mais arrays locais sendo que eu irei usa-las mais que uma vez?

Certo, entгo eu comecei a usar arrays globais.

Entгo quando й que eu devo usar arrays locais?
Simples, quando for usa-la apenas 1 vez, caso use mais que 1 vez torna-a global.

Mas entгo e as strings?

Faзa o mesmo, alias elas sгo uma array, mas sim teremos um tratamento diferente com elas, dos quais sгo:
  • Mбximo de cйlulas
    • Caso seja uma string para texto use no mбximo 128 caracteres.
    • Caso seja para salvamento de dados vocк pode usar mais que 128, no meu caso eu uso 600 pois uso MySQL e no pawn requer uma string(query) grande.
  • Globais ou Locais?
    • Em caso de strings eu aconselho vocк a colocar global, ou seja, a string й usada para formatar um testo e nгo para armazenar dados o que permite vocк usar apenas uma, caso queira usar string para gravar dados ai sim poderб fazer uma local.
  • Quantidade
    • Em caso de strings crie apenas 1 no seu cуdigo, mas como eu disse sу em caso extremos em que vocк deseja armazenar uma string ai sim pode criar mais que 1.
Vocк tambйm pode usar o rBitz feito pelo RyDeR`, clique Aqui para ver um tutorial sobre o rBitz feito pelo Shelby, o rBitz й muito ъtil, ele faz com que o seu amx fique mais pequeno e que use Bits mais pequenos, pois cada array й igual a 32 Bits, com o rBitz vocк pode usar arrays de 1 Bit, 2 Bits , 4 Bits, 8 Bits e 16 Bits.

Indentar
Indentar й uma coisa muito ъtil nos nossos cуdigos, cada um pode adotar o seu prуprio "estilo", a idenзгo nгo й sу obrigatуria como torna o seu cуdigo bonito e limpo, exemplo de cуdigo

pawn Code:
CMD:commando(playerid)
{
    if(IsPlayerAdmin(playerid))    
    {    
        GivePlayerMoney(playerid,1000);        
    }    
    return 1;    
}
Este cуdigo jб esta identado, isto й o minimo que vocк deve fazer apertando TAB vocк farб uma raiz mais ou menos.

PHP Code:
{
    {
        {
            {
                {
                }
            }
        }
    }

Como vocк pode ver no nosso comando gastamos 8 linhas mas podemos usar a Operaзгo ternбria que faz nosso cуdigo ficar ainda pequeno, entгo veja.

pawn Code:
CMD:commando(playerid)
    return IsPlayerAdmin(playerid) ? true : (GivePlayerMoney(playerid,1000), true);
Neste caso nуs gastamos apenas 1/4 das 8 linhas, ou seja, 2 linhas, o que й realmente muito pouco, vocк pode consultar o tуpico do Garfield Aqui , ele й ъtil em alguns casos, claro que nгo iremos usar em cуdigos grandes com funзхes grandes, mas vocк pode criar o seu prуprio estilo, lembrando que essas idenзхes nгo tornaram o seu cуdigo mais rбpido, nunca fiz um teste alias, mas tornaram o seu cуdigo mais pequeno, pois se vocк ultrapassar o limite de linhas no pawn o seu amx comeзara a ter erros.(atualmente nгo sei o limite de linhas mas acho que й 120mil linhas, entгo й sempre bom identamos os nossos cуdigos)

Benchmarks


As benchmarks sгo chamado os testes de velocidade, a uns tempos atras fiz um tуpico com testes de velocidade que estavam errados mas agora aprendi, as Benchmarks servem para optimizar o seu server, ou seja, vocк usarб coisas mais rбpidas e em termos de execuзгo fara com o que o seu servidor seja mais rбpido a executar certas funзхes, mas lembrando que para vocк fazer uma benchmark nгo pode ficar vendo videos, musicas ou falando com alguйm, pois a benchmark irб se alterar em microssegundos o que poderб trazer um mau resultado.

No meu caso eu uso esta benchmark feito pelo Slice que encontrei Aqui e eu uso esta:

pawn Code:
#define BENCH(%0,%1) \
    for(new _i, _t = GetTickCount(), _c; _t; ) \
        if(_t != GetTickCount()) \
            for(_i = _t = GetTickCount(); _t; _i = GetTickCount()) \
                if((_i - _t) == (%0)) \
                    for(_t = GetTickCount(); _t; ) \
                        if(_t != GetTickCount()) \
                            for(_i = _t = GetTickCount(); ; ++_c, _i = GetTickCount()) \
                                if((_i - _t) == (%0)) { \
                                    printf(" Bench for " %1 ": executes, by average, %.2f times/ms.", floatdiv(_c, (%0))); \
                                    _t = 0; \
                                    break; \
                                } else
Criada pelo Nero_3D

Vocк tambйm pode ver o tуpico feito pelo DarKiNs clicando Aqui ele mostra resultados muito uteis, sendo que podemos usar funзхes mais rapidas e fazendo que o seu cуdigo fique mais optimizado.

Entгo foi isto pessoal, espero que tenham gostado.

Crйditos
  • ~BlueX
    • Criador do tutorial;
  • ~Garfield
    • Criador do tutorial da Operaзгo ternбria;
  • ~Nero_3D
    • Criador do marco para a benchmark;
  • ~RyDeR`
    • Criador do rBitz;
  • ~Shelby
    • Criador do tutorial do rBitz;
  • ~DarKiNs
    • Criador do tуpico de optimizaзгo/benchmark;
  • ~Slice
    • Criador do tutorial do benchmark;
Reply
#2

Thanks for credits,
PS: i hate rBits.
Reply
#3

Interessante, gostei
Reply
#4

Muito bom esse tutorial
Reply
#5

tuturial muito bom
sempre usei uma boa identaзao nos meus codigos.
й mais facil de ler e de perceber onde estгo os erros
jб agora obrigado pela benchmark. nгo conhecia essa e й sempre util para testes.
edit: nгo gosto de rbits e nao planeio usar.
o meu amx tem quase 3.8mb (tenho mais de 35 mil objetos)
Reply
#6

Уtimo tutorial.
Reply
#7

Deveria dar exemplos sobre string globais e locais.
Para que muita gente possa corrigir isso em GameModes.
Reply
#8

Destaco tambйm que nгo й nada bom usar strings globais em format's contidos em funзхes chamadas por timers.

Isso porque se vocк tambйm a usa em um comando por exemplo, essa string pode ser formatada uma vez no comando, e logo em seguida na funзгo do timer.

Em outras palavras, poderб ocorrer a substituiзгo da mensagem do comando, pela 'mensagem' do timer.
Reply
#9

Faltou falar que nгo se pode criar string global e depois dar strcat nela.
Reply
#10

Otimo Tuto.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)