none
StringBuilder versus @"string com quebra de linha" RRS feed

  • Pergunta

  • Olá pessoal,

    Como funciona quando seto o valor de uma string no C# utilizando @ (veja exemplo abaixo)? Quero saber como funciona internamente, se perco algo em performance para saber se devo utilizar o StringBuilder.

    string text = @"Lorem ipsum dolor sit amet, consectetur adipiscing
            elit. Fusce vitae purus erat, ac tristique urna. Cras
            eget nisi urna. Nulla nunc elit, fringilla at dictum ut, 
            sagittis porttitor diam. Aenean malesuada suscipit 
            neque, pretium fermentum tortor sodales sed. 
            Aliquam rhoncus sagittis enim hendrerit aliquam. ";
    

     

    Grato.


    João Paulo Gomes http://johnowl.com/
    quarta-feira, 11 de maio de 2011 13:46

Respostas

  • http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx
    One word frees us of all the weight and pain of life: that word is love.
    quarta-feira, 11 de maio de 2011 14:10
    Moderador
  • quarta-feira, 11 de maio de 2011 16:43
  •  
    João Paulo, pelo que conheço, utilizando a primeira forma você não está concatenando strings, na primeira forma o compilador verifica que existe um inicio de string e não para de realizar a leitura até encontrar o ponto e virgula finalizando a instrução. Agora se você realmente estivesse realizando as concatenações com o sinal de + (CSharp), ai teriam que ser feitas diversas operações em memória, que no caso o StringBuilder é muito mais eficiente.

    Comparando as formas diria que a primeira forma seja mais rápido, pois não há concatenações, sendo que o stringbuilder, mesmo sendo eficiente no que faz, teria que realizar algumas movimentações na memória.

     

     


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    quarta-feira, 11 de maio de 2011 16:57
  •  

    StringBuilder sb = new StringBuilder();
    sb.Append("SELECT Codigo, Destinatario, Logradouro, Numero, ");
    sb.Append("Complemento, Bairro, Cidade, Estado FROM Enderecos ");
    sb.Append("ORDER BY Destinatario");
    Pelo que li nos links enviados, o StringBuilder deve ser utilizado principalmente dentro de loops.

    Quanto ao literal @ não encontrei nada a respeito de performance, a diferença é que quando eu declaro o @ antes das aspas de uma string não é necessário "escapar" os caracteres especiais da string e outras coisas como consta no link abaixo:

    http://www.peachpit.com/articles/article.aspx?p=31938&seqNum=10

    Fiquei com essa dúvida pois estou acostumado a declarar minhas queries SQL assim:

     

    string sql = @"SELECT Codigo, Destinatario, Logradouro, Numero, 
        Complemento, Bairro, Cidade, Estado 
        FROM Enderecos 
        ORDER BY Destinatario";
    

     

    Mas vi no código de uma empresa que eles costumam fazer usando StringBuilder e achei que poderia ser por causa de performance já que desta maneira o código fica menos legível:


    Hoje, olhando novamente o código percebi que são feitos algumas concatenações quando existe a cláusula WHERE na query e como o SB é mais rápido por isso optaram por fazer desta maneira. Vou acabar utilizando os dois recursos:

    StringBuilder sb = new StringBuilder(@"
             SELECT Codigo, Destinatario,
             Logradouro, Numero, Bairro, Cidade, Estado
             FROM Enderecos");

    Obrigado a todos pelas respostas.


    João Paulo Gomes http://johnowl.com/
    quarta-feira, 11 de maio de 2011 22:32

Todas as Respostas

  • http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx
    One word frees us of all the weight and pain of life: that word is love.
    quarta-feira, 11 de maio de 2011 14:10
    Moderador
  • Na verdade minha dúvida está relacionada ao método Append do StringBuilder. Gostaria de saber se tem diferença de performance entre isso:

    string texto = @"Lorem ipsum dolor sit amet, consectetur adipiscing
      elit. Fusce vitae purus erat, ac tristique urna. Cras
      eget nisi urna. Nulla nunc elit, fringilla at dictum ut, 
      sagittis porttitor diam. Aenean malesuada suscipit 
      neque, pretium fermentum tortor sodales sed. 
      Aliquam rhoncus sagittis enim hendrerit aliquam. ";
    
    Response.Write(texto);

    E isso:

     

    StringBuilder sb = new StringBuilder();
    
    sb.Append("Lorem ipsum dolor sit amet, consectetur adipiscing");
    sb.Append("elit. Fusce vitae purus erat, ac tristique urna. Cras");
    sb.Append("eget nisi urna. Nulla nunc elit, fringilla at dictum ut, ");
    sb.Append("sagittis porttitor diam. Aenean malesuada suscipit ");
    sb.Append("neque, pretium fermentum tortor sodales sed. ");
    sb.Append("Aliquam rhoncus sagittis enim hendrerit aliquam. ");
    
    Response.Write(sb.ToString());
    Grato.

     


    João Paulo Gomes http://johnowl.com/
    • Editado João Paulo Gomes quarta-feira, 11 de maio de 2011 16:19 problema de formatação
    quarta-feira, 11 de maio de 2011 16:18
  • quarta-feira, 11 de maio de 2011 16:43
  •  
    João Paulo, pelo que conheço, utilizando a primeira forma você não está concatenando strings, na primeira forma o compilador verifica que existe um inicio de string e não para de realizar a leitura até encontrar o ponto e virgula finalizando a instrução. Agora se você realmente estivesse realizando as concatenações com o sinal de + (CSharp), ai teriam que ser feitas diversas operações em memória, que no caso o StringBuilder é muito mais eficiente.

    Comparando as formas diria que a primeira forma seja mais rápido, pois não há concatenações, sendo que o stringbuilder, mesmo sendo eficiente no que faz, teria que realizar algumas movimentações na memória.

     

     


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    quarta-feira, 11 de maio de 2011 16:57

  • Na verdade minha dúvida está relacionada ao método Append do StringBuilder. Gostaria de saber se tem diferença de performance entre isso:

     

    string texto = @"Lorem ipsum dolor sit amet, consectetur adipiscing
     elit. Fusce vitae purus erat, ac tristique urna. Cras
     eget nisi urna. Nulla nunc elit, fringilla at dictum ut, 
     sagittis porttitor diam. Aenean malesuada suscipit 
     neque, pretium fermentum tortor sodales sed. 
     Aliquam rhoncus sagittis enim hendrerit aliquam. ";
    
    Response.Write(texto);
    

     

    E isso:

     

    StringBuilder sb = new StringBuilder();
    
    sb.Append("Lorem ipsum dolor sit amet, consectetur adipiscing");
    sb.Append("elit. Fusce vitae purus erat, ac tristique urna. Cras");
    sb.Append("eget nisi urna. Nulla nunc elit, fringilla at dictum ut, ");
    sb.Append("sagittis porttitor diam. Aenean malesuada suscipit ");
    sb.Append("neque, pretium fermentum tortor sodales sed. ");
    sb.Append("Aliquam rhoncus sagittis enim hendrerit aliquam. ");
    
    Response.Write(sb.ToString());
    Grato.

     


    João Paulo Gomes http://johnowl.com/


    João Paulo, pelo que conheço, utilizando a primeira forma você não está concatenando strings, na primeira forma o compilador verifica que existe um inicio de string e não para de realizar a leitura até encontrar o ponto e virgula finalizando a instrução. Agora se você realmente estivesse realizando as concatenações com o sinal de + (CSharp), ai teriam que ser feitas diversas operações em memória, que no caso o StringBuilder é muito mais eficiente.

    Comparando as formas diria que a primeira forma seja mais rápido, pois não há concatenações, sendo que o stringbuilder, mesmo sendo eficiente no que faz, teria que realizar algumas movimentações na memória.

     

     


    Abraço

    Estevam

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***

     

    Creio que o StringBuilder seria mais indicado no caso de replace mesmo né.


    []'s Rafael
    quarta-feira, 11 de maio de 2011 17:46
  •  

    StringBuilder sb = new StringBuilder();
    sb.Append("SELECT Codigo, Destinatario, Logradouro, Numero, ");
    sb.Append("Complemento, Bairro, Cidade, Estado FROM Enderecos ");
    sb.Append("ORDER BY Destinatario");
    Pelo que li nos links enviados, o StringBuilder deve ser utilizado principalmente dentro de loops.

    Quanto ao literal @ não encontrei nada a respeito de performance, a diferença é que quando eu declaro o @ antes das aspas de uma string não é necessário "escapar" os caracteres especiais da string e outras coisas como consta no link abaixo:

    http://www.peachpit.com/articles/article.aspx?p=31938&seqNum=10

    Fiquei com essa dúvida pois estou acostumado a declarar minhas queries SQL assim:

     

    string sql = @"SELECT Codigo, Destinatario, Logradouro, Numero, 
        Complemento, Bairro, Cidade, Estado 
        FROM Enderecos 
        ORDER BY Destinatario";
    

     

    Mas vi no código de uma empresa que eles costumam fazer usando StringBuilder e achei que poderia ser por causa de performance já que desta maneira o código fica menos legível:


    Hoje, olhando novamente o código percebi que são feitos algumas concatenações quando existe a cláusula WHERE na query e como o SB é mais rápido por isso optaram por fazer desta maneira. Vou acabar utilizando os dois recursos:

    StringBuilder sb = new StringBuilder(@"
             SELECT Codigo, Destinatario,
             Logradouro, Numero, Bairro, Cidade, Estado
             FROM Enderecos");

    Obrigado a todos pelas respostas.


    João Paulo Gomes http://johnowl.com/
    quarta-feira, 11 de maio de 2011 22:32