Pergunta

Eu estou trabalhando em um projeto que requer algum processamento de JavaScript muito complicado. Isto inclui uma série de if-elses aninhados em alguns lugares. Eu geralmente tomado cuidado para otimizar o código JavaScript, tanto quanto possível através da leitura das outras dicas sobre estouro de pilha, mas eu estou querendo saber se as duas construções seguintes faria qualquer diferença em termos de velocidade só:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

vs

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}
Foi útil?

Solução

Eu sempre ir com o primeiro método. Mais fácil de ler, e menos recuo. Na medida em que a velocidade de execução, isso vai depender da implementação, mas eu esperaria-los tanto para ser idênticos.

Outras dicas

Em muitas línguas, é uma prática comum para if href="https://stackoverflow.com/questions/268132/invert-if-statement-to-reduce-nesting"> para reduzir nidificação ou utilização condições .

E ter menos aninhando em seu código melhora a legibilidade do código e sustentabilidade.

"do perfil, não especular!"

  1. você está colocando o carro na frente dos bois (manutenção por seres humanos supera a velocidade da máquina)
  2. Você deve dirigir seus esforços de otimização pelo medições , o que significa

    • você deve cronometrar a execução si mesmo; ele vai, obviamente, diferem em diferentes navegadores e versões
    • você só deve otimizar a velocidade do hotspots de sua aplicação (ver ponto 1)

Não haverá nenhuma diferença no desempenho Eu recomendaria o segundo exemplo para manutenção. Em geral, é boa prática para ter um e somente um possível ponto de saída para uma rotina. Ela ajuda a depuração e compreensão.

Vou usar a primeira abordagem ao excluir as situações inválidos.

Por exemplo. use primeira abordagem ao fazer algumas validações, e voltar se algum da validação falhar. Não há nenhum ponto em ir mais longe se qualquer um dos pré-requisitos falhar. A mesma coisa é mencionado por Martin Fowler em seu Refactoring livro. Ele chama isso de "Substituir as condições com cláusulas da Guarda". E isso pode realmente fazer o código fácil de entender.

Aqui está um exemplo java.

  public void debitAccount(Account account, BigDecimal amount) {
    if(account.user == getCurrentUser()) {
      if(account.balance > amount) {
           account.balance = account.balance - amount
       } else {
          //return or throw exception
       }
    } else {
        //return or throw exception
    }
  }

VS

 public void debitAccount(Account account, BigDecimal amount) {
    if(account.user != getCurrentUser()) return //or error
    if(account.balance < amount) return //or error
    account.balance = account.balance - amount    
}

Talvez um pouco, mas eu não acho que vai ser mensurável a menos que o resto da função envolve "pesado" (e de outra forma redundante, pois presumo que um retorno daria mesmo resultado) js chamadas.

Como uma nota lateral, eu acho que isso é micro otimização desnecessário, e você provavelmente deve procurar outro lugar para melhorias de desempenho, ou seja, o perfil do roteiro através de ferramentas ou desenvolvedor do Chrome Firebug para o Firefox (ou ferramentas similares) e olhar para o longo e lento corrida / chamadas / funções.

Enquanto isso depende da implementação de JavaScript do navegador em execução, não deve haver qualquer diferença notável entre elas (em termos de velocidade).

A segunda forma é preferível uma vez que quebra o caudal não é um bom hábito de programação. Também pensar sobre isso em conjunto, a instrução de salto (micro operação) é sempre avaliada independentemente da avaliação.

Test-lo sozinho. Se este JavaScript está sendo executado no navegador, ele quase certamente vai depender de JavaScript mecanismo de análise do navegador.

O meu entendimento é que não iria fazer a diferença porque você ramificar com a condição if. Então, se some_condition é verdade, a parte mais vai não ser tocado, mesmo sem o retorno.

Suponhamos que o return leva 1ms versus os aninhados 0,1ms if tomada (ou vice-versa).

É difícil imaginar qualquer um ser quase tão lento.

Agora, você está fazendo isso mais de 100 vezes por segundo?

Se assim for, talvez você deve se preocupar.

Quando há apenas um único if..else o desempenho é quase o mesmo e isso não importa. Use o que é melhor legível no seu caso. Mas vindo para instruções aninhadas usando return é a mais perfeita comparação com if...else e case switch

Falando de minhas experiências depende da condição que está a verificar.

  1. if .. return é bom e fácil de ler se você verificar alguma condição boolean (talvez definição) que faria todo o código a seguir desnecessária a ser executado em tudo.

  2. if .. else é muito mais fácil de ler se você espera algum valor para ser um dos dois (ou mais) valores possíveis e que pretende executar código diferente para ambos os casos. Ou seja, os dois valores possíveis representam condições de igual valor interpretável pelo que deve ser escrito no mesmo nível lógico.

Na minha opinião, retorno e outra coisa é o mesmo para o caso acima, mas em if-else geral e if()return; são muito diferentes. Você pode usar instrução de retorno quando você quer mover-se do actual âmbito de escopo pai enquanto no caso de if-else você pode verificar para posterior if-else no mesmo escopo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top