Sou psicólogo com formação clássica, não sou programador, portanto, às vezes, os aspectos mais avançados da programação me escapam, especialmente em relação à eficiência do programa e / ou a certas práticas recomendadas, neste caso no que diz respeito ao uso de variáveis.
Aqui está algum pseudo-código:
var a;
var b;
var c;
function GetSomeInformation() {
returns "XYZ";
}
a = GetSomeInformation();
b = GetSomeInformation();
c = GetSomeInformation();
Portanto, minha pergunta é:
É mais ou menos eficiente (ou o mesmo) armazenar dados em uma variável uma vez e referenciar isso em oposição a chamadas repetidas para a mesma função?
IE, esse código é mais eficiente?
var results = GetSomeInformation();
a = results;
b = results;
c = results;
Em caso afirmativo, esse ganho ou perda de eficiência geralmente é o mesmo entre os idiomas ou varia de acordo com o idioma? Existem limites nos quais se torna melhor nomear uma variável em vez de usar uma chamada de função repetida ou vice-versa? Que aspectos podem mudar sua eficiência (por exemplo, existe uma diferença se é uma função de membro de uma classe versus uma função regular no escopo global)? etc.
Se possível, gostaria de saber especificamente como essa noção se aplica às caixas de diálogo C ++ / MFC, como surgiu quando eu estava escrevendo algum código nessa estrutura.
// define pointers to the items in my form
CListBox *pLISTBOX = (CListBox*) GetDlgItem(LISTBOX);
CStatic *pSTATIC_A = (CStatic*) GetDlgItem(STATIC_A);
CStatic *pSTATIC_B = (CStatic*) GetDlgItem(STATIC_B);
CEdit *pEDIT_BOX_A = (CEdit*) GetDlgItem(EDIT_BOX_A);
CEdit *pEDIT_BOX_B = (CEdit*) GetDlgItem(EDIT_BOX_B);
int SelectedIndex = pLISTBOX->GetCurSel();
pSTATIC_A->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pSTATIC_B->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pEDIT_BOX_A->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pEDIT_BOX_B->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
fonte
GetSomeInformation
) for pura e o compilador estiver ciente desse fato. Caso contrário, o compilador precisará chamá-lo três vezes para garantir que os efeitos colaterais ocorram conforme o esperado.Além disso, um bom compilador (incluindo o JIT do Java) alinhará chamadas de método repetidas e armazenará em cache valores usados repetidamente, de modo que os dois exemplos provavelmente acabariam tendo um desempenho comparável.
Consulte as seguintes regras práticas:
Faça funcionar, faça certo, faça rápido ... nessa ordem. - Kent Beck
A primeira regra de otimização : não.
A segunda regra de otimização : não ... ainda.
A terceira regra de otimização : perfil antes de otimizar
Otimização prematura é a raiz de todo o mal. - Donald Knuth
Na maioria dos casos,> 90% do tempo do seu programa será gasto em <10% do código e, sem criar um perfil do seu código, você não tem idéia de quais 10% são. Portanto, nem se preocupe com isso até receber feedback; é muito mais valioso otimizar o tempo do programador do que o tempo de execução .
fonte
Geralmente é mais eficiente armazenar um valor calculado em uma variável local, supondo que seu compilador ainda não otimize isso para você. De fato, às vezes isso é incorporado à própria função, em uma técnica chamada memoização .
No entanto, na maioria das vezes, o ganho de eficiência é pequeno o suficiente para ser considerado insignificante. A legibilidade geralmente deve ser sua principal preocupação após a correção.
Dito isto, o uso de uma variável local também costuma torná-lo mais legível, oferecendo o melhor dos dois mundos. Usando seu exemplo:
Isso é muito mais claro para um leitor humano. Não apenas você não precisa ler essa chamada de função longa em todas as linhas, mas é explicitamente claro que todos os widgets estão recebendo exatamente o mesmo texto.
fonte
As variáveis são essencialmente gratuitas, mas a chamada de função tem um custo desconhecido, portanto, sempre vá com a variável.
fonte
Um princípio geral que sigo é que, se eu não souber como uma função é implementada, pode ser caro e se eu souber que só preciso do valor dessa função uma vez, apenas a armazeno localmente. Seu exemplo de código se tornaria:
fonte