No AS3, acredito que você deve inicializar todas as variáveis fora dos loops para aumentar o desempenho. Este também é o caso do JavaScript? Qual é a melhor / mais rápida / melhor prática?
var value = 0;
for (var i = 0; i < 100; i++)
{
value = somearray[i];
}
ou
for (var i = 0 ; i < 100; i++)
{
var value = somearray[i];
}
javascript
performance
davivid
fonte
fonte
Respostas:
Não há absolutamente nenhuma diferença em significado ou desempenho, em JavaScript ou ActionScript.
var
é uma diretiva para o analisador e não um comando executado em tempo de execução. Se um identificador específico tiver sido declaradovar
uma ou mais vezes em qualquer lugar do corpo da função (*), todo o uso desse identificador no bloco estará se referindo à variável local. Não faz diferença sevalue
é declaradovar
dentro do loop, fora do loop ou em ambos.Consequentemente, você deve escrever o que achar mais legível. Discordo de Crockford de que colocar todos os vars no topo de uma função é sempre a melhor coisa. No caso em que uma variável é usada temporariamente em uma seção do código, é melhor declarar
var
nessa seção, para que a seção fique sozinha e possa ser copiada e colada. Caso contrário, copie e cole algumas linhas de código em uma nova função durante a refatoração, sem selecionar e mover separadamente o associadovar
, e você terá um mundo acidental.Em particular:
Crockford recomendará que você remova o segundo
var
(ou remova ambosvar
e façavar i;
acima), e o jslint o fará querer isso. Mas, na IMO, é mais sustentável manter os doisvar
s, mantendo todo o código relacionado unido, em vez de ter um trecho extra de código facilmente esquecido na parte superior da função.Pessoalmente, tenho a tendência de declarar
var
a primeira atribuição de uma variável em uma seção independente de código, se existe ou não outro uso separado do mesmo nome de variável em alguma outra parte da mesma função. Para mim, ter que declararvar
é uma verruga JS indesejável (seria melhor ter variáveis padrão para local); Não vejo como meu dever duplicar as limitações de [uma antiga revisão do] ANSI C em JavaScript também.(*: exceto em corpos de função aninhados)
fonte
var
seja usado apenas na parte superior de uma função é apenas solicitar a criação acidental de variáveis globais. E ter uma massa de variáveis não relacionadas todas declaradas em um ponto é semanticamente sem sentido, especialmente quando algumas dessas variáveis podem acabar nunca sendo usadas.Em teoria, não deve fazer diferença no JavaScript, pois a linguagem não possui escopo de bloco, mas apenas escopo de função.
Não tenho certeza sobre o argumento de desempenho, mas Douglas Crockford ainda recomenda que as
var
instruções sejam as primeiras no corpo da função. Citando Convenções de Código para a Linguagem de Programação JavaScript :Eu acho que ele tem razão, como você pode ver no exemplo a seguir. Declarar as variáveis na parte superior da função não deve confundir os leitores ao pensarem que a variável
i
é mantida no escopo dofor
bloco de loop:fonte
ecma- / javascript
aumentará essas em tempo de execução. Isso é chamado de "elevação". Portanto, não deve haver nenhuma diferença.let
afeta essa resposta?O
ECMA-/Javascript
idioma dehoists
qualquer variável declarada em qualquer lugar no topo de uma função. Isso é porque essa linguagem não temfunction scope
e faz não têmblock scope
como muitas outras linguagens C-like.Isso também é conhecido como
lexical scope
.Se você declarar algo como
Isso chega
hoisted
a:Portanto, não faz nenhuma diferença no desempenho (mas me corrija se estiver totalmente errado aqui).
Um argumento muito melhor para não declarar uma variável em outro lugar do que na parte superior de uma função é a legibilidade . Declarar uma variável dentro de um
for-loop
pode levar à suposição errada de que essa variável só pode ser acessada dentro do corpo do loop, o que está totalmente errado . De fato, você pode acessar essa variável em qualquer lugar do escopo atual.fonte
let
afeta essa resposta?No próximo ano, todos os navegadores terão mecanismos JS que pré-compilam o código, para que a diferença de desempenho (que vem da análise do mesmo bloco de código repetidamente e da execução da atribuição) se torne insignificante.
Além disso, nunca otimize o desempenho, a menos que seja necessário. Manter as variáveis próximas ao local em que você precisa delas na primeira vez mantém seu código limpo. No lado negativo, as pessoas que estão acostumadas a idiomas com escopos de bloco podem ficar confusas.
fonte
Outra consideração, agora que temos
let
econst
no ES2015, é que agora você pode escopo variáveis especificamente para o bloco de loop. Portanto, a menos que você precise da mesma variável fora do loop (ou se cada iteração depende de uma operação feita nessa variável na iteração anterior), provavelmente é preferível fazer isso:fonte
Acabei de fazer um teste simples no Chrome. Experimente o violino no seu navegador e veja os resultados
O resultado é que o último teste leva ~ 8 segundos e os 2 anteriores são apenas ~ 2 segundos. Muito repetidamente e independentemente da ordem.
Então, isso prova para mim que sempre se deve declarar os vars fora do loop. Caso curioso para mim é o primeiro onde declaro
i
na declaração for (). Este parece ser tão rápido quanto o segundo teste em que eu pré-declaro o índice.fonte
var
está declarando como global uma variável que seria seja global de qualquer maneira.JavaScript é uma linguagem escrita na parte inferior por C ou C ++, não tenho muita certeza de qual é. E um de seus objetivos é economizar o manuseio de lidar com a memória interna. Mesmo em C ou C ++, você não precisará se preocupar se consumirá muitos recursos quando variáveis forem declaradas dentro de um loop. Por que você deveria se preocupar com isso em JavaScript?
fonte
Bem, isso depende do que você está tentando alcançar ... se
value
suponha ser apenas uma variável temporária dentro do bloco de loop, é muito mais claro usar a segunda forma. Também é mais lógico e detalhado.fonte
Não faz diferença se você declarar variáveis dentro ou fora do loop for. Abaixo está o código de exemplo para testar.
Os resultados mostraram no meu caso
Obrigado - MyFavs.in
fonte
let
vez devar
ea()
tende a ser um pouco mais lento (como 120 vs 115 ms = ~ 6% = IMO insignificante)A questão aqui é basicamente declarar um var dentro de um loop. Basta pensar no que acontece se você fizer isso:
Acha que isto é certo? Não ... porque você não deseja declarar uma variável tantas vezes. Quando você declara uma variável dentro de um loop, ela não está declarando quantas vezes o loop é executado? Obviamente, isso lhe dará um tapa quando você estiver no modo 'use strict'. As pessoas discordaram de Crockford sem pensar na questão original.
Portanto, é sempre bom declarar variáveis no topo - 1. Para facilitar a leitura, 2. Criar bons hábitos.
fonte
Em relação ao desempenho após a execução do teste no Chrome, Firefox e jsperf em um sistema operacional Linux, parece haver uma diferença de desempenho entre a declaração de variáveis em um loop e fora de um loop. É uma pequena diferença, mas isso também é composto pela quantidade de iterações e pela quantidade de declarações de variáveis.
Portanto, para obter o melhor desempenho, eu teria que sugerir a declaração de variáveis fora do loop. Ou melhor ainda, declare suas variáveis em linha. Consultar exemplo.
Observe como as variáveis 'al' e 'av' estão na linha de declaração do loop for. Esta declaração em linha me proporcionou um desempenho consistentemente melhor. Mesmo com a declaração de variáveis fora do loop. Novamente, a diferença de desempenho é realmente pequena.
https://jsperf.com/outside-inline-for-loop-ase/1
fonte