M emoria na O timizaзг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 é 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 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ções, etc, pois a ideia aqui é evitar ao máximo o uso excessivo de vários 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://scriptsamp.forumeiros.com/t47941-tutorial-variveis-definio-uso-e-tipos#97518
1.2 M étodo de benchmark
- Usando o método do Slice: https://scriptsamp.forumeiros.com/t49266-tutorial-comparacao#98925 Todos os testes de benchmark rodaram por pelo menos 1 minuto em cada teste para evitar picos de processamento, e foram feitos em 3 espécies 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 comuns que me deixam neste fórum, é a criação e destruição de vários 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 como:
- Código:
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 Entendo 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 um formato de função, destrói essa mesma variável.
2.2 O timizando com variáveis globais
- A primeira solução, é criar uma variável global para evitar criar e destruir um vetor toda vez que precisarmos desta informação.
PHP como:
- Código:
new pName[24];
stock GetName(playerid)
{
GetPlayerName(playerid,pName,24);
return pName;
}
format(string,100,"Seu nome й: %s",GetName(playerid));- Mesmo que evitemos a criação e destruição desta variável, ainda podemos evitar que a função GetPlayerName seja chamada sempre. Basta tornar este vetor em uma matriz per-player e então obter o nome do jogador quando ele se conectar. Caso você use SetPlayerName por qualquer motivo, não se esqueça de definir o valor de pName para o novo nick do jogador, ou o antigo será usado no lugar.
PHP como:
- Código:
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 R esultados
- As funções de formato foram incluídas nos testes de desempenho, sendo o eixo Y referente às execuções por milissegundo.
3. C onsiderações finais
- Espero que tenha entendido a ideia deste tutorial. Mesmo sendo curto, acredito que a ideologia ficou bem explicada. Você deve abusar de variáveis globais, mas sempre ficar atento ao consumo de memória do servidor, mesmo o uso sendo baixíssimo comparado a outros aplicativos. Use a memoria do servidor sempre que puder evitar o processador. Não deixe de comentar alguma crítica ou sugestão.
Creditos: arakuta