Otimizando seu código #1 - StringBuilder

Discussão em 'Software' iniciado por Lucas_Gamer13, 17 Junho 2018.

?

Gostou da minha explicação?

  1. Sim, está ótima!

    100.0%
  2. Sim, mas tente mostrar mais coisas na prática!

    0 voto(s)
    0.0%
  3. Não, está faltando detalhes...

    0 voto(s)
    0.0%
  4. Não, não entendi nada...

    0 voto(s)
    0.0%
  5. Outro

    0 voto(s)
    0.0%
  1. Lucas_Gamer13
    Offline

    Lucas_Gamer13 Veterano Veterano VIP Sabotador.com VIP Sabotador.com VIP Industrial

    Afiliado:
    17 Novembro 2015
    Mensagens:
    1,704
    Sexo:
    Masculino
    Avaliações:
    +1,608 / -0
    Apelido no Minecraft:
    Lucas_gamer13
    Otimizando seu código #1
    StringBuilder



    Esse é o primeiro episódio da série Otimizando seu código onde vamos conversar e um aprender um com o outro técnicas para otimizar o seu código, hojê vamos falar sobre StringBuilder!

    Tenho quase certeza que todos daqui usam ou já usaram o operador "+" quando vai juntar 2 ou mais Strings, abaixo você vai ver quão problemático é o uso desse operador com frequência...

    Primeira coisa que devemos saber é, String são imutáveis. Ou seja, você não pode mudar o seu valor após sua primeira atribuição, isso quer dizer que quando você utiliza o operador "+" você não está adicionando nada na String, e sim criando outro objeto na memória, e a String antiga perde sua atribuição, mas continua na memória!

    Vamos ver um exemplo na prática!

    No código abaixo vamos adicionar 65536 vezes o char 'a' na String "f1" e "f2" porêm na "f1" vamos utilizar o operador "+" e na string "f2" o StringBuilder, e vamos ver quanto tempo demora cada um ser concluido!
    Código (Forge Crash):
        public static void main(String[] args){

            long runtime = System.currentTimeMillis();




            //code 1

            String f1 = "";
           for(int x = 0; x<65536; x++){
               f1 += "a";
              }
             System.out.println("Runtime 1 = "+(System.currentTimeMillis()-runtime)+"ms");
            runtime = System.currentTimeMillis();







            //code 2

            String f2 = "";
            StringBuilder sb = new StringBuilder();
            for(int x = 0; x<65536; x++){
                sb.append("a");
            }
                f2 = sb.toString();
            System.out.println("Runtime 2 = "+(System.currentTimeMillis()-runtime)+"ms");

           

        }
    Agora é hora de ver os resultados! O operador "+" demorou 3421ms em quanto o StringBuilder fez tudo isso em apenas 1ms! Duvida? Teste em seu computador!
    Screenshot_1.png

    E isso é apenas em 65536 vezes! Imagina se fosse em um jogo ou em um plugin de minecraft... E imagine se isso tivesse que ser processado todo segundo, se fosse em um jogo iria dar um lag, e em um plugin o tps iria a 0...

    Porêm se for uma coisa simples que raramente vai ser usada, ela pode ser feita com "+"...

    Agora é sua vez! O que você tem a compartilhar? Não esqueça de votar no começo do tópico! Espero que tenham gostado! :grin:


     
    • Gostei Gostei x 2
    • Vencedor Vencedor x 1
  2. Ketuo
    Offline

    Ketuo Membro Conhecido VIP Sabotador.com VIP Sabotador.com

    Afiliado:
    28 Fevereiro 2017
    Mensagens:
    703
    Sexo:
    Feminino
    Avaliações:
    +480 / -1
    Apelido no Minecraft:
    Kaljak_Sirah1
    Mais please, seria legal tipo, uns "tira-duvidas" sobre a api do JDA,bukkit,etc, afinal, não tem uma área para falar sobre o JDA :wink: gostei do "tópico-playlist" :grin: espero que continua :grin:, pode me dar spoiler do próximo? kkk
     
    • Amigável Amigável x 1
  3. Lucas_Gamer13
    Offline

    Lucas_Gamer13 Veterano Veterano VIP Sabotador.com VIP Sabotador.com VIP Industrial

    Afiliado:
    17 Novembro 2015
    Mensagens:
    1,704
    Sexo:
    Masculino
    Avaliações:
    +1,608 / -0
    Apelido no Minecraft:
    Lucas_gamer13
    Tava pensando em fazer Switch vs if/else
     
    • Gostei Gostei x 1
  4. Animadoria
    Offline

    Animadoria Membro Conhecido VIP Sabotador.com

    Afiliado:
    17 Agosto 2014
    Mensagens:
    737
    Avaliações:
    +584 / -1
    Apelido no Minecraft:
    Animadoria
    Isto é Java em geral, você pode usar isto em JDA e em Bukkit.
     
    • Concordo Concordo x 1
    • Informativo Informativo x 1
  5. Ketuo
    Offline

    Ketuo Membro Conhecido VIP Sabotador.com VIP Sabotador.com

    Afiliado:
    28 Fevereiro 2017
    Mensagens:
    703
    Sexo:
    Feminino
    Avaliações:
    +480 / -1
    Apelido no Minecraft:
    Kaljak_Sirah1
    Faz sobre Switch vs If/Else :grin:
     
  6. armelin1
    Offline

    armelin1 Moderador Sênior do Fórum Equipe GameMods Moderador do Fórum Veterano VIP Sabotador.com VIP Sabotador.com VIP Industrial

    Afiliado:
    5 Maio 2014
    Mensagens:
    1,872
    Sexo:
    Masculino
    Avaliações:
    +641 / -0
    Apelido no Minecraft:
    armelin1
    Software | GameMods
    É só abrir um tópico aqui, é um local pra discutir sobre software.
     
    • Informativo Informativo x 1
  7. FRNathan13
    Offline

    FRNathan13 Membro Ativo

    Afiliado:
    7 Outubro 2015
    Mensagens:
    80
    Sexo:
    Masculino
    Avaliações:
    +48 / -0
    Apelido no Minecraft:
    nathan1302
    Tópico Sensacional.

    Além do tempo do StringBuilder e do += , deve levar em consideração o consumo de memória, se não me engano String Builder tem uma alocação menor na memória.

    Veja um teste feito nesse website. Java Performance - String, StringBuffer and StringBuilder Memory and Runtime Analysis o StringBuilder realmente aparenta utilizar menos alocação de memória.

    Código (Forge Crash):

    Initial Max memory in Java virtual machine in KBs=253440
    ........
    String memory test

    Initial Total memory in Java virtual machine in KBs=15872
    Initial Free memory in Java virtual machine in KBs=15590
    Time taken to complete the process :23113
    Memory used by String in KBs=2674
    Free Memory after GC in KBs=15792
      ........
    StringBuffer memory test

    Initial Total memory in Java virtual machine in KBs=15936
    Initial Free memory in Java virtual machine in KBs=15792
    Time taken to complete the process :6
    Memory used by StringBuffer in KBs=1199
    Free Memory after GC in KBs=15792
      ........
    StringBuilder memory test

    Initial Total memory in Java virtual machine in KBs=15936
    Initial Free memory in Java virtual machine in KBs=15792
    Time taken to complete the process in MilliSeconds:5
    Memory used by StringBuilder in KBs=1199
    Free Memory after GC in KBs=15792

     
     
    • Gostei Gostei x 1
    • Top Top x 1
  8. Foxx Games
    Offline

    Foxx Games Veterano Veterano VIP Industrial

    Afiliado:
    30 Abril 2014
    Mensagens:
    1,243
    Sexo:
    Masculino
    Avaliações:
    +847 / -0
    Apelido no Minecraft:
    NathanPB
    No bytecode o switch vira if/else. A única diferença é no código
     
    • Informativo Informativo x 2
  9. Lucas_Gamer13
    Offline

    Lucas_Gamer13 Veterano Veterano VIP Sabotador.com VIP Sabotador.com VIP Industrial

    Afiliado:
    17 Novembro 2015
    Mensagens:
    1,704
    Sexo:
    Masculino
    Avaliações:
    +1,608 / -0
    Apelido no Minecraft:
    Lucas_gamer13
    Humm, pensei que tinha uma diferença, eu ví uma pessoa criticando um código de outra pelo fato dela usar vários if e else... valeu por avisar :hearth:
     
    • Gostei Gostei x 2
  10. Industrial_GamerOficial
    Offline

    Industrial_GamerOficial Veterano Veterano VIP Sabotador.com VIP Sabotador.com

    Afiliado:
    30 Outubro 2015
    Mensagens:
    283
    Sexo:
    Masculino
    Avaliações:
    +66 / -3
    Apelido no Minecraft:
    industrialgmr
    É uma boa ideia @Lucas_Gamer13. Praticamente a mesma coisa, mas tao diferentes...
    --- Post duplo mesclado, 21 Junho 2018 ---
    Sim, mas acho que se realizar o teste de performance o Switch sera mais rápido, não?
     
  11. Foxx Games
    Offline

    Foxx Games Veterano Veterano VIP Industrial

    Afiliado:
    30 Abril 2014
    Mensagens:
    1,243
    Sexo:
    Masculino
    Avaliações:
    +847 / -0
    Apelido no Minecraft:
    NathanPB
    Não tem diferença, na hora de executar eles SÃO a mesma coisa
     
    • Informativo Informativo x 1
  12. Ketuo
    Offline

    Ketuo Membro Conhecido VIP Sabotador.com VIP Sabotador.com

    Afiliado:
    28 Fevereiro 2017
    Mensagens:
    703
    Sexo:
    Feminino
    Avaliações:
    +480 / -1
    Apelido no Minecraft:
    Kaljak_Sirah1
    Então switch/if é a mesma coisa na hora do Run? Ou se usar switch ou if e tals algum deles consomem mais RAM e tals?
     
  13. HeyZeer0
    Online

    HeyZeer0 Moderador Sênior do Fórum e do Discord Equipe GameMods Moderador do Fórum Moderador do Discord VIP Industrial

    Afiliado:
    6 Agosto 2011
    Mensagens:
    571
    Sexo:
    Masculino
    Avaliações:
    +354 / -0
    Apelido no Minecraft:
    HeyZeer0
    3 perguntas iguais, SIM, no bytecode, que é o que você gera quando compila e o que é executado na JVM, o switch torna-se if/else ou seja NÃO afeta a performance se você usar switch ou if/else.
     
    • Informativo Informativo x 1
    • Útil Útil x 1
  14. Foxx Games
    Offline

    Foxx Games Veterano Veterano VIP Industrial

    Afiliado:
    30 Abril 2014
    Mensagens:
    1,243
    Sexo:
    Masculino
    Avaliações:
    +847 / -0
    Apelido no Minecraft:
    NathanPB
    Bom, compilei três exemplos pra mostrar, vou deixar os três aqui pra vocês verem:
    • TesteIf.java: Foi usado uma estrutura if/else para comparar ints usando operadores binários
    • TesteIf2.java: Foi usado uma estrutura if (sem else) para comparar ints usando operadores binários
    • TesteSwitch.java: Foi usado uma estrutura switch para comparar ints
    Aqui estão os bytecodes dos três exemplos:
    Dá pra ver que o switch usa exatamente a mesma estrutura do if/else (TesteIf.java). Usaria a estrutura do TesteIf2.java (sem o else) caso eu não usasse o 'break;', que pula a execução para a próxima linha depois da estrutura (GOTO L5)

    Pra concluir: If e Switch não tem nenhuma diferença no runtime, mas é sempre melhor usar o else (ou break) em contextos como esse.

    Se eu estiver errado alguém me corrige, sou novato estudando o bytecode
     
    • Vencedor Vencedor x 2
  15. Ketuo
    Offline

    Ketuo Membro Conhecido VIP Sabotador.com VIP Sabotador.com

    Afiliado:
    28 Fevereiro 2017
    Mensagens:
    703
    Sexo:
    Feminino
    Avaliações:
    +480 / -1
    Apelido no Minecraft:
    Kaljak_Sirah1
    Valeu mano xD então resumindo: If/Switch não tem nenhuma diferença no runtime mas é melhor usar o else (ou break) né? Valeu pela ajuda xD
     
    • Gostei Gostei x 1
  16. Foxx Games
    Offline

    Foxx Games Veterano Veterano VIP Industrial

    Afiliado:
    30 Abril 2014
    Mensagens:
    1,243
    Sexo:
    Masculino
    Avaliações:
    +847 / -0
    Apelido no Minecraft:
    NathanPB
    Eu sinceramente tinha duvidado do resultado, sabia que tinha diferença, mas não tanta. Fui pro teste:

    Código (Javascript):
    public class TesteString {
        public static void main(String[] args) {

            String s1 = "";
            long time = System.nanoTime();
            for(int i=0; i<= 1000; i++){
                s1+="a";
            }
            time = System.nanoTime() - time;
            System.out.printf("Concatenação de String: \t\t%dns\n", time);

            StringBuilder s2 = new StringBuilder();
            long time2 = System.nanoTime();
            for(int i=0; i<=100; i++){
                s2.append("a");
            }
            time2 = System.nanoTime() - time2;
            System.out.printf("Concatenação de StringBuilder: \t%dns\n", time2);

        }
    }
     
    Resultado:

    Código (Forge Crash):
    Concatenação de String:          3135622ns
    Concatenação de StringBuilder:     11399ns
    Tô assustado, eu usei concatenação com String a minha vida toda
     
    • Gostei Gostei x 1
  17. armelin1
    Offline

    armelin1 Moderador Sênior do Fórum Equipe GameMods Moderador do Fórum Veterano VIP Sabotador.com VIP Sabotador.com VIP Industrial

    Afiliado:
    5 Maio 2014
    Mensagens:
    1,872
    Sexo:
    Masculino
    Avaliações:
    +641 / -0
    Apelido no Minecraft:
    armelin1
    O Intellij IDEA sempre recomendava usar StringBuilder em loops.
     
  18. Lucas_Gamer13
    Offline

    Lucas_Gamer13 Veterano Veterano VIP Sabotador.com VIP Sabotador.com VIP Industrial

    Afiliado:
    17 Novembro 2015
    Mensagens:
    1,704
    Sexo:
    Masculino
    Avaliações:
    +1,608 / -0
    Apelido no Minecraft:
    Lucas_gamer13
    Isso pode ter dado alguma diferença no resultado... 1000 e 100, mas mesmo assim acho que não passa de 2ms...
     
  19. Foxx Games
    Offline

    Foxx Games Veterano Veterano VIP Industrial

    Afiliado:
    30 Abril 2014
    Mensagens:
    1,243
    Sexo:
    Masculino
    Avaliações:
    +847 / -0
    Apelido no Minecraft:
    NathanPB
    KKKKKKKKKKKKKKKKKKKKKKKK NEM NOTEI

    Anyway é só adicionar um zero a direita que corrige

    valeu
     

Compartilhe esta Página