Recentemente, eu estava dando uma olhada nos símbolos no Ruby e nas suas vantagens, e então eu comecei a perceber em quais cenários esses caras afirmam serem muito melhores do que o jeito tradicional. Então eu comecei a escrever alguns pequenos pedaços de código para testar o desempenho no meu laptop que tem um i7 com 4 gigs de RAM.
O motivo pelo qual eu sempre penso sobre essas coisas é porque acredito que você não possa somente conhecer um recurso, mas também deve saber quando ele é eficaz e quando ele não é. Dessa maneira, você pode ser um bom desenvolvedor e escrever um bom código. Como no C#, muitas pessoas simplesmente dizem que o StringBuilder é bem mais rápido que Strings. Bom, isso não é sempre verdade, e Jon Skeet desmascara essa afirmação em detalhes.
Então, fazendo algumas testes com código, devo dizer que nem sempre o uso de símbolos é muito efetivo ou pelo menos aumenta o desempenho. Mas isso não significa que foi pobre, comparado ao modo tradicional. Então abaixo segue o código que estou usando para testar o desempenho.
Como você pode ver na imagem acima, eu mostrei o código e a saída. No código abaixo da condição if, estou apenas comparando a variável condition à string “yes” e ao símbolo :yes em outra condição if. Portanto, depois de executar o código acima, eu obtive os resultados mostrados na parte de baixo da imagem. Apenas observe as últimas colunas entre parênteses. Os símbolos estão gastando mais tempo do que as strings literais. Por favor, note que o iterationcount é de apenas 1000. Ao aumentá-lo para o valor de 100000, eu obtive os seguintes resultados:
“ruby 1.9.2p290 (2011-07-09 revision 32553) [i486-linux]“
user system total real
string literal 0.020000 0.000000 0.020000 ( 0.023764)
via symbols… 0.020000 0.000000 0.020000 ( 0.022699)
Agora você pode ver um resultado trocado. O resultado da string literal está levando mais tempo que o de símbolos. Agora vamos adicionar uma ação à condicional if no código acima e testar o desempenho de novo. Veja o código abaixo:
Como você pode ver no código acima, determinei o iterationcount a 1000 e adicionei um pequeno código ao body da if condition. Primeiramente, você pode pensar que os resultados de desempenho variam por uma margem sutil. Mas, na verdade, a partir dos resultados que eu obtive, é uma diferença bem grande. Ao diminuir a contagem da iteração, a margem de diferença entre as amostras é bem menor. Então não faz o menor sentido escolher qualquer um dos jeitos.
Portanto, pense ao escolher qual deles é perfeito para seu problema baseado na frequência do literal que você tem no seu código. Segundo o código acima, ao aumentar as iterações, a eficiência dos símbolos é muito melhor do que a string literal.
?
Texto original disponível em http://adventurouszen.wordpress.com/2011/10/10/ruby-symbols-performance-analysis/