Você sabe se o uso de aspas duplas em vez de aspas simples no ruby diminui o desempenho de alguma maneira significativa no ruby 1.8 e 1.9.
então se eu digitar
question = 'my question'
é mais rápido que
question = "my question"
Imagino que o ruby tente descobrir se algo precisa ser avaliado quando encontrar aspas duplas e provavelmente gasta alguns ciclos fazendo exatamente isso.
ruby
performance
syntax
dimus
fonte
fonte
Respostas:
Nota: Eu atualizei isso para fazê-lo funcionar com as versões mais recentes do Ruby, limpei o cabeçalho e execute a referência em um sistema mais rápido.
Esta resposta omite alguns pontos-chave. Veja especialmente essas outras respostas sobre interpolação e a razão pela qual não há diferença significativa no desempenho ao usar aspas simples e duplas.
fonte
'
e"
como eles são analisados para a mesma coisa.Resumo: sem diferença de velocidade; este ótimo guia colaborativo de estilo Ruby recomenda ser consistente. Agora uso a
'string'
menos que seja necessária interpolação (opção A no guia) e goste, mas você normalmente verá mais código com"string"
.Detalhes:
Teoricamente, pode fazer a diferença quando seu código é analisado , mas você não deve se preocupar apenas com o tempo de análise em geral (desprezível em comparação com o tempo de execução), como também não poderá encontrar uma diferença significativa nesse caso.
O importante é que, quando for executado , será exatamente o mesmo .
O benchmarking mostra apenas uma falta de entendimento de como o Ruby funciona. Nos dois casos, as seqüências serão analisadas para a
tSTRING_CONTENT
(consulte a fonte emparse.y
). Em outras palavras, a CPU passará exatamente pelas mesmas operações ao criar'string'
ou"string"
. Os mesmos bits exatos mudarão exatamente da mesma maneira. O benchmarking mostra apenas diferenças que não são significativas e são devidas a outros fatores (entrada do GC, etc.) lembre-se, não pode haver nenhuma diferença neste caso! Micro benchmarks como esses são difíceis de acertar. Veja minha joiafruity
para uma ferramenta decente para isso.Observe que, se houver interpolação do formulário
"...#{...}..."
, isso será analisado para atSTRING_DBEG
, um monte detSTRING_DVAR
para cada expressão em#{...}
e uma finaltSTRING_DEND
. Isso é apenas se houver interpolação, o que não é o objetivo do OP.Eu costumava sugerir que você use aspas duplas em todos os lugares (torna mais fácil adicioná-las
#{some_var}
posteriormente), mas agora uso aspas simples, a menos que precise de interpolação\n
, etc ... Eu gosto visualmente e é um pouco mais explícito, pois não há precisa analisar a string para ver se ela contém alguma expressão.fonte
#{n}
que estaria fazendo a conversão de números). Não está mostrando as diferenças na análise ?.Porém, ninguém mediu concatenação x interpolação:
Especificamente, observe
assign interp = 2.62
vsconcat single = 3.76
. Como cereja no topo do bolo, também acho a interpolação mais legível do que'a' + var + 'b'
especialmente no que diz respeito aos espaços.fonte
Não há diferença - a menos que você esteja usando a
#{some_var}
interpolação de string de estilo. Mas você só obtém o desempenho atingido se realmente fizer isso.Modificado a partir do exemplo da Zetetic :
resultado
fonte
As aspas simples podem ser muito mais rápidas que as aspas duplas, porque o lexer não precisa procurar
#{}
marcadores de interpolação. Dependendo da implementação, etc. Observe que esse é um custo de tempo de análise, não um custo de tempo de execução.Dito isso, a questão real era se o uso de strings com aspas duplas "diminui o desempenho de maneira significativa", para o qual a resposta é um "não" decisivo. A diferença de desempenho é tão incrivelmente pequena que é completamente insignificante em comparação com quaisquer preocupações reais de desempenho. Não perca seu tempo.
A interpolação real é uma história diferente, é claro.
'foo'
será quase exatamente 1 segundo mais rápido que"#{sleep 1; nil}foo"
.fonte
As aspas duplas levam o dobro do número de pressionamentos de tecla para digitar do que aspas simples. Estou sempre com pressa. Eu uso aspas simples. :) E sim, considero isso um "ganho de desempenho". :)
fonte
Pensei em adicionar uma comparação entre 1.8.7 e 1.9.2. Eu os corri algumas vezes. A variação foi de cerca de + -0,01.
ruby 1.8.7 (nível de patch 302 2010-08) [x86_64-linux]
ruby 1.9.2p0 (18/08/2010 revisão 29036) [x86_64-linux]
fonte
Não há diferença significativa em nenhuma direção. Teria que ser enorme para que isso importasse.
Exceto nos momentos em que você tem certeza de que há um problema real com o tempo, otimize a manutenção do programador.
Os custos do tempo da máquina são muito muito pequenos. Os custos do tempo do programador para escrever e mantê-lo são enormes.
Qual a utilidade de uma otimização para economizar segundos e até minutos de execução em milhares de execuções, se isso significa que o código é mais difícil de manter?
Escolha um estilo e mantenha-o, mas não escolha esse estilo com base em milissegundos de tempo de execução estatisticamente insignificantes.
fonte
Eu também pensei que seqüências de caracteres entre aspas simples poderiam ser mais rápidas para analisar Ruby. Não parece ser o caso.
De qualquer forma, acho que o benchmark acima está medindo a coisa errada. É lógico que ambas as versões serão analisadas nas mesmas representações internas de cadeia de caracteres. Para obter a resposta mais rápida, não devemos medir o desempenho com variáveis de cadeia, mas a velocidade de Ruby de analisar cadeias.
Execuções repetidas não parecem fazer muita diferença. Ainda leva praticamente o mesmo tempo para analisar qualquer versão da string.
fonte
Certamente é possível, dependendo da implementação, mas a parte de varredura do intérprete deve olhar apenas para cada caractere uma vez. Será necessário apenas um estado adicional (ou um conjunto possível de estados) e transições para manipular # {} blocos.
Em um scanner baseado em tabela, haverá uma única pesquisa para determinar a transição e, de qualquer maneira, acontecerá para cada personagem.
Quando o analisador obtém a saída do scanner, já é sabido que ele terá que avaliar o código no bloco. Portanto, a sobrecarga é apenas a sobrecarga de memória no scanner / analisador para manipular o bloco # {}, pelo qual você paga de qualquer maneira.
A menos que esteja faltando alguma coisa (ou lembrando os detalhes da construção do compilador), o que também é certamente possível :)
fonte
fonte
Todos vocês sentiram falta de um.
AQUI doc
tente isso
Deu-me
e
por isso é certamente melhor do que concat e escrever todas essas opções.
Eu gostaria de ver Ruby ensinado mais ao longo das linhas de uma linguagem de manipulação de documentos.
Afinal, nós realmente não fazemos isso no Rails, Sinatra e na execução de testes?
fonte
Modifiquei a resposta de Tim Snowhite.
Resultados:
fonte
Eu tentei o seguinte:
E estas são as saídas:
1
2)
3)
4)
5)
6
7)
8)
9
10)
Se não me enganei, parece-me que os dois demoram aproximadamente o mesmo tempo, embora o único citado seja um pouco mais rápido na maioria dos casos.
fonte