O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Aula Especial - Otimização dos códigos

Iniciado por Raizen, 28/02/2013 às 19:00

[box class=information]
Otimização dos códigos
[/box]

[box class=information]
Introdução
[/box]
[box class=catbg3]  A aula é direcionada a quem já é scripter e tem uma certa experiência, por isso busca melhorar os códigos e buscar melhorar a velocidade de seus scripts.

  Tem 2 maneiras principais de melhorarem a velocidade dos seus codes, 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 e agora o segundo que irei tratar nessa aula, a melhor maneira de usar esses mesmos comandos. Todos os comandos eu testei pelo com benchmark, não é 100% eficiente, porém dá uma ideia muito boa da velocidade de cada bloco de códigos e aqui abaixo falarei o resultado de tudo que eu testei :D.[/box]

[box class=information]
Contas básicas
[/box]
[box class=catbg3]Esse por ser muito usado pela grande maioria dos scripts, então presente em quase todos os scripts é algo que muitos sabem. As contas envolvendo a própria variável são mais rápidas se usados o modo simplificado, porém minimamente mais rápido se não iguais, por isso o ideal é manterem o modo simplificado, exemplo.

a = a + 1


O modo simplificado
a += 1

Isso para as 4 operações + - / *
[/box]

[box class=information]
Atribuição múltipla
[/box]
[box class=catbg3] Agora esse é bem interessante, veja os 2 códigos a seguir.
a = b = c = 1

a = 1
b = 1
c = 1

Todos tem o mesmo resultado, qual é mais rápido? Não não é o primeiro, é o segundo :D, exatamente parece menos otimizado porém em todos os testes que eu fiz, troquei as ordens dos 2 e tudo mais, deram 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, acho mais elegante e organizado do que linha por linha, porém para atualizações prefere-se o código mais rápido, logo... O segundo.[/box]

[box class=information]
If ou unless?
[/box]
[box class=catbg3]Ta ai algo que eu vejo inclusive os scripters mais experientes pisando na bola as vezes, isso inclui a mim :P.
Primeira regra,
if
é em geral mais rápido que
unless

Ta ai 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 aonde o pessoal pisa na bola.
if !algo

ou
if not algo

não use o not ou o !, eles invertem o resultado e depois verificam a condição, ou seja ele faz 2 processos para 1, ai use o unless
unless algo






Aqui para frente começa aos mais cometidos pelos scripters.
if !algo and !algo2
Esse daqui pega muita gente :P, principalmente quem nunca teve lógica de programação e coisas semelhantes, vocês viram antes para evitarem o ! e o not, mas quando tem algo como and ou or no meio, como vamos mudar isso para tirar esses !?

Dica, façam uma tabela verdade, falso sempre que na dúvida, que seria o seguinte.
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 eu mostor uns atalhos, perceba que a sequencia é F, F, F, V; Logo precisamos buscar uma combinação lógica que dê F, F, F, V.

Pensaram? vou falar abaixo a resposta :).
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 ficaria como o código abaixo.
unless algo or algo2 # mesmo valor que if !algo and !algo2


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




Agora o que 99% dos scripters cometem, isso não é necessário fazer, não é nenhum erro, porém em uma atualização pode fazer diferença que é usar diferente de.
Usem caso seja necessário fazer um bloco de condições com igualdades e diferenças exemplo.
if algo != 5 and algo == 4

Ai sem problemas porém evitem.
if algo != 5


Usem o unless
unless algo == 5


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

[box class=information]
Utilização de simbologia
[/box]
[box class=catbg3]Esse talvez foi o teste mais difícil que foi feito, a diferença era minima, porém com leituras e tudo mais, existe a recomendação da utilização de simbolos do que utilizar as reservadas, não usei simbolos acima pois não sabia se todos conheciam, mas o jeito mais fácil de lembrar é simplesmente.
&& == and
|| == or
! == not
condição ? true : false == if condição then true else false
[/box]

[box class=information]
Utilização de blocos
[/box]
[box class=catbg3]Esse daqui muita gente não usa, usar os blocos do que as reservadas.
Os blocos são mais eficientes pela simples razão explicadas por um amigo meu que trabalha com Ruby há 7 anos, os blocos while, loop do, for; enfim, eles quando 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
for i in 0...5
$umaarray[i] = 4
end


Isso poderia ser executado por um bloco da seguinte maneira.
$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 usar os blocos são mais eficientes quando for possível, então priorizem-nos u__u
[/box]

[box class=information]
Conclusão
[/box]
[box class=catbg3]Não sei se alguém realmente irá aprender algo, porém ai está, e essa é a magia do Ruby :D, 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, e cada vez cresce mais :D, bom boa sorte nas aulas espero que estejam sendo uteis.[/box]

28/02/2013 às 19:24 #1 Última edição: 05/09/2019 às 14:56 por NumPaD
Erro 404!
A mensagem não foi encontrada!

variavel = 5
if variavel == 5
  p "sim igual a 5 :D"
else
 p "não D:"
end


é o mesmo que
variavel == 5 ? p "sim igual a 5 :D" : p "não D:"


Ele é ideal para o if/else de 1 condição. :D

28/02/2013 às 20:14 #3 Última edição: 05/09/2019 às 14:58 por NumPaD
Erro 404!
A mensagem não foi encontrada!

Sim xD, faça uns testes no rpg maker, o Ace usa muitos atalhos que tem aqui no tópico, e o RMXP é tudo bem ao pé da letra, se tiver os 2 é interessante dar uma olhada para ver o tamanho da diferença xD.

Mas é isso mesmo a ideia, ele é o if/else compactado, usado muito para 1 condição, 1 se verdadeiro e 1 se falso.

Tu sempre me conta só metade da história, né?

Poxa mano, creio que ainda não viu o código da HUD
que eu tenho aqui, mas depois dessa, se visse me
espancaria. Assim que der um tempinho vou mudar
bastante coisa por algumas aí, apesar de estar rodando
de boa lá já, mas é sempre bom melhorar, né?

Esse tempo tá complicado eu voltar a estudar isso, mas
uma hora tudo se resolve eu voltarei a te atormentar com
minhas noobice, mas de já, as aulas irão ajudar sim...

Até, fera!
  :ok:

Raizen. The Best! Quero aprender! Não entendi nada, são cálculos matemáticos?

Peço desculpas por reviver o tópico, mas essa aula foi muito boa.

Parabéns, Raizen! Gostaria de ver mais aulas como essa. Otimização dos códigos é justamente o que eu procuro.