Aldeia RPG

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte ao desenvolvimento de jogos


2 participantes

    Otimização dos códigos

    Valentine
    Valentine
    Administrador
    Administrador


    Medalhas : Otimização dos códigos ZgLkiRU
    Mensagens : 5345
    Créditos : 1164

    Otimização dos códigos Empty Otimização dos códigos

    Mensagem por Valentine Sáb Mar 25, 2017 8:01 am

    Introdução
    Essa aula é direcionada a quem já tem uma certa experiência em programação, que busca melhorar os códigos e a velocidade de seus scripts.

    Você tem 2 maneiras principais de melhorar a velocidade dos seus scripts. A primeira e mais óbvia é buscar o menor caminho usando a menor quantidade de comandos. Quanto menos comandos, obviamente, o código tende a ser mais rápido. Já o segundo ponto que irei tratar diz respeito à melhor maneira de usar esses mesmos comandos. Eu testei todos os comandos pelo benchmark, que, embora não seja 100% eficiente, dá uma ideia muito boa da velocidade de cada bloco de código. Logo abaixo, mostrarei o resultado de tudo que eu testei.

    Contas básicas
    Esse, por ser muito usado pela grande maioria dos programadores, está presente em quase todos os scripts e é algo que muitos sabem. As contas envolvendo a própria variável são mais rápidas se você usar o modo simplificado, porém minimamente mais rápido, se não iguais, por isso o ideal é manter o modo simplificado. Exemplo:

    Código:
    a = a + 1

    O modo simplificado:
    Código:
    a += 1
    Isso para as 4 operações + - / *

    Atribuição múltipla
    Esse é bem interessante. Veja os 2 códigos a seguir:
    Código:
    a = b = c = 1
    Código:
    a = 1
    b = 1
    c = 1
    Se todos têm o mesmo resultado, qual é o mais rápido? Não, não é o primeiro, e sim o segundo! O segundo parece menos otimizado, porém, em todos os testes que eu fiz, mesmo trocado a ordem dos 2 e tudo mais, deu o mesmo resultado: a atribuição múltipla é menos eficiente do que 1 por 1. Então, qual usar?
    Nesse caso, depende, deixar o a = b = c = 1 para algo que inicia apenas, pois acho mais elegante e organizado do que linha por linha, porém, para atualizações (def update), prefere-se o código mais rápido, logo... o segundo!

    If ou unless?
    Ta ai algo que eu vejo muita gente, inclusive os scripters mais experientes, pisando na bola às vezes.
    Primeira regra:
    Código:
    if
    é, em geral, mais rápido que:
    Código:
    unless
    Isso é normal, quase todo mundo usa mais if que unless, e faz sentido, já que o if tem uma reservada de menor tamanho que unless. Agora, vamos ver onde o pessoal pisa na bola:
    Código:
    if !algo
    ou
    Código:
    if not algo
    Não use o not ou o !, pois eles invertem o resultado e depois verificam a condição, ou seja, eles fazem 2 processos para 1. Nesse caso, use o unless
    Código:
    unless algo






    Daqui para frente começam os erros mais cometidos pelos scripters.
    Código:
    if !algo and !algo2
    Esse daqui pega muita gente, principalmente quem nunca estudou lógica de programação e coisas semelhantes. Vocês viram anteriormente que devemos evitar o ! e o not, mas e quando tiver algo como and ou or no meio, como vamos mudar isso para tirar esses !?

    Dica: façam uma tabela verdade e falso sempre que tiver dúvidas:
    Código:
    p !true and !true # imprime falso
    p !true and !false #imprime falso
    p !false and !true #imprime falso
    p !false and !false #imprime verdadeiro
    Claro que esse é o modo na raça de se fazer, mas, em breve, irei mostrar uns atalhos. Perceba que a sequencia é F, F, F, V. Logo, precisaremos buscar uma combinação lógica que dê F, F, F, V.

    Pensaram? Vou mostrar a resposta:
    Código:
    p (not (true or true)) # imprime falso
    p (not (true or false)) #imprime falso
    p (not (false or true)) #imprime falso
    p (not (false or false)) #imprime verdadeiro
    Espera, mas o if not pode ser unless, não? Logo, o resultado seria o código abaixo:
    Código:
    unless algo or algo2 # mesmo valor que if !algo and !algo2

    O atalho é o seguinte: fazendo várias tabelas verdade/falso, percebi alguns padrões, e esse seria um deles.
    !algo e !algo2 podem ser trocados por !(algo ou algo2)




    Vamos agora para o erro que 99% dos scripters cometem. Na verdade, não se trata de um erro, mas em uma atualização (def update) pode fazer muita diferença, que é usar diferente de (!=)

    Use caso seja necessário fazer um bloco de condições com igualdades e diferenças. Exemplo:
    Código:
    if algo != 5 and algo == 4
    Até ai, tudo bem. Porém, evitem:
    Código:
    if algo != 5

    Use o unless:
    Código:
    unless algo == 5

    Ou seja, priorizem a igualdade sempre que possível. A desigualdade faz algo semelhante ao !, ela procura ver o que não é, do que o que é, e isso deixa o programa levemente mais devagar.

    Utilização de simbologia
    Esse talvez foi o teste mais difícil que eu fiz, pois a diferença foi mínima, porém existe a recomendação da utilização de símbolos em vez das palavras reservadas. Não usei símbolos anteriormente, pois não sabia se todos tinham conhecimento deles, mas o jeito mais fácil de lembrar é:
    Código:
    && == and
    || == or
    ! == not
    condição ? true : false == if condição then true else false

    Utilização de blocos
    Esse daqui muita gente não usa: usar os blocos em vez das palavras reservadas.
    Os blocos são mais eficientes pela simples razão explicada por um amigo que trabalha com Ruby há 7 anos, os blocos while, loop do, for; enfim, quando eles são chamados, criam um bloco externamente e rodam por ele, ou seja, eles pegam o que está dentro do for e criam um modo de inserir no bloco. Exemplo:
    Código:
    for i in 0...5
    $umaarray[i] = 4
    end

    Isso poderia ser executado por um bloco da seguinte maneira:
    Código:
    $umaarray.each {|ar| ar = 4}
    Claro que considerando que o for vai pegar todos os espaços pela array, que quase sempre é o caso, logo os blocos são mais eficientes quando for possível usá-los, então priorizem os benditos blocos!

    Conclusão
    Não sei se alguém realmente irá aprender algo, porém fiz esse tutorial mesmo assim, e essa é a magia do Ruby, ele pode ser uma linguagem totalmente lógica usando as palavras, mas também tem a possibilidade de ser uma linguagem rápida, e muita gente está usando Ruby, e cada vez cresce mais. Bom, boa sorte a todos nas aulas e espero que elas estejam sendo úteis.

    Créditos:
    Raizen

    Tópico original:
    http://centrorpg.com/index.php?topic=2373.0


    Última edição por Valentine em Sex Dez 17, 2021 8:05 am, editado 1 vez(es)
    snaker15
    snaker15
    Semi-Experiente
    Semi-Experiente


    Mensagens : 128
    Créditos : 24

    Otimização dos códigos Empty Re: Otimização dos códigos

    Mensagem por snaker15 Sáb Mar 25, 2017 11:49 am

    Muito bom, eu particulamente nunca me preocupei em dar uma refinada na forma que programo, tem algumas coisas ai que já tinha visto em alguns codigos e nunca tinha me dado o luxo de pesquisar e acabei entendendo o que quer dizer agora isso já vai servir pra varias coisas a partir de agora !
    grato pela contribuição !

      Data/hora atual: Qui Nov 21, 2024 10:40 am