7.3 Eficiência

O paradigma imperativo é baseado na maquina de Turing e na arquitetura von Neumann de computadores , consequentemente esses programas são naturalmente eficientes quando executados nessa arquitetura; enquanto o paradigma declarativo é totalmente diferente deste modelo, sendo programas escritos neste geralmente menos eficientes no uso de CPU e memória que programas imperativos, como C, Pascal e Java .

Essa perda de eficiência se dá pelo fato de não existir definição de fluxo de controle na programação declarativa, de modo que qualquer iteração deve ser feita de forma recursiva. O problema é que quando uma função é chamada de forma recursiva, a pilha é usada para armazenar todos os dados de todas as instâncias dessa função, e se a função recursiva chama a si mesmo muitas vezes, a pilha pode ficar sem memória; enquanto que, em programas imperativos, para cada iteração são usadas as mesmas células de memória, tendo essas apenas seus valores alterados a cada ciclo do loop.

Em compensação, graças a propriedades como transparência referencial, ausência de efeitos colaterais e imutabilidade dos dados, o compilador pode aplicar técnicas de otimização (e.g., memoização e eliminação de subexpressões comuns) para remover computações desnecessárias; sendo difícil de aplicar essas técnicas em programas imperativos de forma a manter a integridade dos valores, e portanto a confiabilidade do software.

Além disso, avanços tecnológicos para a construção de microprocessadores têm permitido cada vez mais que sistemas ganhem maior desempenho executando de forma paralela. Contudo, não houve grandes avanços quanto ao desenvolvimento de paradigmas e linguagens para se aproveitar esse recurso, sendo agora o ponto mais crítico no desenvolvimento de um sistema paralelo não mais a modelagem do hardware, e sim o desenvolvimento do software .

Muitos pesquisadores afirmam que o paradigma imperativo é inadequado para o processamento paralelo, já que seus conceitos são baseados no modelo von Neuman de “uma operação por vez” , bem como o fato da execução paralela de partes com dados compartilhados poder interferir uma na outra e alterar o resultado esperado. Sendo assim, torna-se uma tarefa complexa, e sem aproveitamento pleno escrever programas em C ou Java para aproveitar os benefícios de processadores multicore. Por outro lado, programas declarativos são naturalmente paralelos, uma vez que são compostos de funções puras e a ordem de execução entre elas é irrelevante. Nesse cenário, linguagens declarativas podem facilmente ser mais eficientes que as do paradigma imperativo.