SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese > Lançamentos/Releases

Reply
 
Thread Tools Display Modes
Old 19/08/2016, 06:22 PM   #1
arakuta
High-roller
 
arakuta's Avatar
 
Join Date: Jan 2011
Location: Itajaí - Brazil
Posts: 2,192
Reputation: 182
Default Memória na Otimização

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: http://forum.sa-mp.com/showthread.php?t=235924
1.2 Método de benchmark
  • Usando o método do Slice: http://forum.sa-mp.com/showthread.php?t=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 Code:
    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 Code:
    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 Code:
    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.

Last edited by arakuta; 02/04/2018 at 11:18 AM.
arakuta is offline   Reply With Quote
Old 19/08/2016, 07:07 PM   #2
WLSF
High-roller
 
Join Date: Aug 2011
Posts: 3,538
Reputation: 771
Default Re: Memória na Otimização

Não consegui entender esse seu gráfico, o que exatamente você está comparando? o que significa o Y-axis?
WLSF is offline   Reply With Quote
Old 19/08/2016, 07:10 PM   #3
F1N4L
High-roller
 
F1N4L's Avatar
 
Join Date: Jun 2013
Location: Brazil
Posts: 2,676
Reputation: 242
Default Re: Memória na Otimização

Sem dúvida é um erro que muitos comentem, inclusive eu.
Ainda atingiu o coração do problema que é a função, acredito eu a mais utilizada, GetPlayerName.
Bom tuto! Curto, porém objetivo!
F1N4L is offline   Reply With Quote
Old 19/08/2016, 10:29 PM   #4
zSuYaNw
Godfather
 
zSuYaNw's Avatar
 
Join Date: Apr 2010
Location: Santa Catarina
Posts: 6,843
Reputation: 660
Default Re: Memória na Otimização

Pelo titulo do tópico confesso que eu esperava algo mais, o certo seria "Manipulando células" ou "Arrays global" mas creio que nenhum desses títulos se encaixaria no tutorial. Eu achei tutorial meio incompleto também pois você teria que explicar qual o tamanho da variável na memória, dizer oque é memória stack e heap qual a diferença delas, como conseguir um valor de uma variável acessando diretamente na memória.

Bom trabalho.
zSuYaNw is offline   Reply With Quote
Old 20/08/2016, 12:48 AM   #5
arakuta
High-roller
 
arakuta's Avatar
 
Join Date: Jan 2011
Location: Itajaí - Brazil
Posts: 2,192
Reputation: 182
Default Re: Memória na Otimização

Quote:
Originally Posted by zSuYaNw View Post
Pelo titulo do tópico confesso que eu esperava algo mais, o certo seria "Manipulando células" ou "Arrays global" mas creio que nenhum desses títulos se encaixaria no tutorial. Eu achei tutorial meio incompleto também pois você teria que explicar qual o tamanho da variável na memória, dizer oque é memória stack e heap qual a diferença delas, como conseguir um valor de uma variável acessando diretamente na memória.

Bom trabalho.
O objetivo é ser bem superficial mesmo, uma explicação rápida do assunto para atiçar a busca por informação.
arakuta is offline   Reply With Quote
Old 20/08/2016, 03:56 AM   #6
ipsBruno
Godfather
 
ipsBruno's Avatar
 
Join Date: Apr 2010
Location: Brazil, Caxias RS
Posts: 6,094
Reputation: 536
Default Respuesta: Memória na Otimização

Pra bom entendedor meia palavra basta, ficou muito bom esse tutorial, com gráfico então matou a pau.


Sabem porque Dini foi devassada por outros métodos de arquivos .ini? Porque a cada Dini_Get ela precisava ler todo arquivo, então você acabava perdendo muito tempo com isto

Assim foram saindo novos métodos de leitura, que você usa File Open para deixar o arquivo na memória você editava ele direto na memória e depois finalmente dava File Save

Qual desvantagem de usar a memória assim? Praticamente nenhuma, você só teria reais problemas se o arquivo fosse maior que 1 ou 2 GB, porque dessa forma iria consumir uma RAM do caralho


Resumindo. Usar memória é sempre mais eficiente, na maioria dos casos, esse exemplo do GetPlayerName é perfeito.


Existem outros métodos de usar a memória. PVAR, GVAR entre outros. No caso de arquivos muito grandes, o melhor mesmo é usar fseek pra pegar apenas uma parte em especifico. Lembra da include do RyDeR chamada mapAndreas?



De modo geral, sempre usem static ao invés de news. É sempre, sempre mais otimizado, porque por padrão as funções de SAMP resetam a váriavel.

Então
Quote:
static playername[24];
GetPlayerName(playerid, playername, 24);
terá o mesmo efeito que usar variáveis globais. Por favor, coloque sobre statics no tutorial
__________________
Baixar Músicas Grátis
ipsBruno is offline   Reply With Quote
Old 20/08/2016, 05:26 AM   #7
Dishz
Big Clucker
 
Dishz's Avatar
 
Join Date: May 2016
Posts: 189
Reputation: 2
Default Re: Respuesta: Memória na Otimização

Quote:
Originally Posted by ipsBruno View Post
static playername[24];
GetPlayerName(playerid, playername, 24);
Partiu mudar.
Dishz is offline   Reply With Quote
Old 20/08/2016, 05:28 AM   #8
RiqueP
Gangsta
 
RiqueP's Avatar
 
Join Date: Jan 2014
Posts: 692
Reputation: 50
Default Re: Memória na Otimização

Bruno incluiu algo realmente importante, o uso do static. Devia falar sobre, mas foi um bom tutorial. Bem básico mas útil.
RiqueP is offline   Reply With Quote
Old 21/08/2016, 01:10 AM   #9
matheusspohr
Gangsta
 
matheusspohr's Avatar
 
Join Date: Feb 2015
Location: Capanema PR
Posts: 674
Reputation: 33
Default Re: Memória na Otimização

Muito bom, mexeu no fundo do problema.
Serve de aviso para muitos, como eu, Tenho essa variavel global, mas geralmente utilizo o GetPlayerName.
Só que você pegar um GM e refazer tudo isso é foda, então, vale lembrar, ir fazendo diferente a frente, pois é muito dificil pegar um GM com mais de 70 mil linhas e mudar tudo.

Abraços.
matheusspohr is offline   Reply With Quote
Old 22/08/2016, 01:58 AM   #10
YtZ
Big Clucker
 
YtZ's Avatar
 
Join Date: Apr 2016
Posts: 76
Reputation: 0
Default Re: Memória na Otimização

É um tutorial bem simples mas acho que pode ajudar novatos. Bom trabalho.
__________________
desenvolvedor full-stack
cursando Ciência da computação/UFV


https://advanced-roleplay.com.br/TorZ
YtZ is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[Ajuda] Sobre otimização pWesley Português/Portuguese 12 06/06/2016 07:01 PM
[Ajuda] Otimização F1N4L Português/Portuguese 7 24/12/2015 05:49 PM
[Ajuda] Otimização! Existe diferença? YanLak Português/Portuguese 2 04/03/2014 04:03 AM
Ajuda com otimização! Hiuship Português/Portuguese 4 24/04/2012 08:17 PM


All times are GMT. The time now is 03:30 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.