19.08.2016, 18:22
(
Последний раз редактировалось arakuta; 02.04.2018 в 11:18.
)
Memуria na Otimizaзгo
Aprenda a deixar seus cуdigos mais bonitos e otimizados!
Нndice
- 1.0 Introduзгo
- 1.1 Prй-requisitos
- 1.2 Mйtodo de benchmark
- 2.0 Criaзгo de variбveis locais
- 2.1 Entendendo o problema
- 2.2 Otimizando com variбveis globais
- 2.3 Resultados
- 3.0 Consideraзхes finais
1. Introduзгo
- Primeiro, quero deixar bem claro que este tutorial serб extremamente superficial, e ideolуgico. Й impossнvel eu explicar todos os casos possнveis para utilizar este mйtodo em otimizaзгo de cуdigos, pois sгo infinitas as possibilidades em que este mйtodo й cabнvel. A ideia que serб passada aqui й genйrica e pode ser utilizada para resolver vбrios problemas. Tenha a consciкncia de que normalmente o primeiro bloco de cуdigo que vocк escreve na maioria das vezes nгo й o mais otimizado. Tambйm nгo vou falar de outras tйcnicas como SWITCH, simplificaзгo de condiзгo, etc, pois a ideia aqui й evitar ao mбximo o uso excessivo de variбveis locais.
1.1 Prй-requisitos
- Й crucial que se pelo menos entenda como funcionam as variбveis, sendo globais, locais, matrizes ou vetores. Caso vocк nгo conheзa ou nгo domine, recomendo que primeiro leia este tutorial do grande rjjj: https://sampforum.blast.hk/showthread.php?tid=235924
1.2 Mйtodo de benchmark
- Usando o mйtodo do Slice: https://sampforum.blast.hk/showthread.php?tid=218491 Todos os testes de benchmark rodaram por pelo menos 1 minuto em cada teste para evitar picos de processamento, e foram feitos em 3 processadores diferentes: Core i5-4690, Xeon E5450, e Pentium E2200, todos em modo de ALTO DESEMPENHO. Todos os dados serгo apresentados em forma de grбfico de barras, em mйdia de execuзхes por milissegundo. Quanto mais alta a barra, melhor.
2. Criaзгo de variбveis locais
- Um dos problemas mais comum que me deparo neste fуrum, й a criaзгo e destruiзгo de variбveis locais onde nem sempre se faz necessбrio. Talvez a funзгo mais comum seja a funзгo simplificada de GetPlayerName que ao invйs de passar o nick do jogador por referкncia, passa por retorno:
PHP код:
stock GetName(playerid)
{
new name[24];
GetPlayerName(playerid,name,24);
return name;
}
// Sendo comumente utilizada em format
format(string,100,"Seu nome й: %s",GetName(playerid));
2.1 Entendendo o problema
- Mesmo parecendo ser uma funзгo inocente, toda vez que й chamada ela cria um vetor de 24 cйlulas, e logo apуs mandar o resultado para a funзгo format, destrуi essa mesma variбvel.
2.2 Otimizando com variбveis globais
- A primeira soluзгo, й criar uma variбvel global para evitar criar e destruir um vetor toda vez que precisar-mos desta informaзгo.
PHP код:
new pName[24];
stock GetName(playerid)
{
GetPlayerName(playerid,pName,24);
return pName;
}
format(string,100,"Seu nome й: %s",GetName(playerid));
- Mesmo que evitamos a criaзгo e destruiзгo desta variбvel, ainda podemos evitar a funзгo GetPlayerName ser chamada sempre. Basta tornar este vetor em uma matriz per-player e entгo obter o nome do jogador quando ele se conecta. Caso vocк use SetPlayerName por qualquer motivo, nгo se esqueзa de setar o valor de pName para o novo nick do jogador, ou o antigo serб usado no lugar.
PHP код:
new pName[MAX_PLAYERS][24];
// Em OnPlayerConnect
GetPlayerName(playerid,pName[playerid],24);
// Toda vez que quiser o nick do jogador, vocк nгo precisa mais de funзгo alguma, afinal ja temos o valor na memуria!
format(string,100,"Seu nome й: %s",pName[playerid]);
2.3 Resultados
- A funзхes de format foram incluнdas nos testes de performance, sendo o eixo Y referente а execuзхes por milissegundo.
3. Consideraзхes finais
- Espero que tenham entendido a ideia deste tutorial. Mesmo sendo curto, creio eu que a ideologia ficou bem explicada. Vocк deve abusar de variбveis globais, mas sempre ficando atento ao consumo de memуria do servidor, mesmo o uso sendo baixнssimo comparado a outras aplicaзхes. Use a memoria do servidor sempre que puder evitar o processador. Nгo deixe de comentar alguma crнtica ou sugestгo.