Segundo a Wikipedia, a regra 90/10 da otimização de programas afirma que "90% do tempo de execução de um programa é gasto na execução de 10% do código" (veja o segundo parágrafo aqui ).
Eu realmente não entendo isso. O que exatamente isso significa? Como 90% do tempo de execução pode ser gasto apenas executando 10% do código? E os outros 90% do código então? Como eles podem ser executados em apenas 10% do tempo?
optimization
theory
program
Rakshith Ravi
fonte
fonte
a++; for(i=0;i<100;i++){b++;} for(i=0;i<100;i++){print(xyz);}
. Certamente, o primeiro loop for passa muito mais do que a primeira instrução, mas o segundo loop passa ~ 1000x mais tempo que o primeiro loop for, mas não é executado . Ele gasta aguardando impressão . Portanto, há uma diferença entre o tempo gasto na execução e o tempo pelo qual o código é responsável .Respostas:
Existem dois princípios básicos em jogo aqui:
A regra 90/10 não é literalmente verdadeira. Varia de acordo com o programa (e duvido que exista alguma base para os números específicos 90 e 10; alguém provavelmente os tirou do ar). Mas o ponto é que, se você precisar que seu programa seja executado mais rapidamente, provavelmente apenas um pequeno número de linhas é significativo para que isso aconteça. Identificar as partes lentas do seu software geralmente é a maior parte da otimização.
Esse é um insight importante e significa que as decisões que parecem contra-intuitivas para um novo desenvolvedor geralmente podem estar corretas. Por exemplo:
fonte
Esta não é uma lei da natureza, mas uma regra de ouro resultante de uma vasta experiência. Também é conhecida como regra 80/20 e é apenas uma aproximação aproximada.
Loops, Ramos e outro controle de fluxo.
Cada local que possui um if, você terá um ramo que é ocupado com mais frequência do que o outro ramo. Assim, é gasto mais tempo de execução executando essa parte do programa, e não a outra parte.
Cada local que possui um loop que é executado mais de uma vez, você tem um código que é executado mais do que o código circundante. Assim, mais tempo é gasto lá.
Como exemplo, considere:
Aqui, o
print("Oh No!")
único será executado apenas no máximo uma vez, e muitas vezes nunca, enquanto oDoWork(i)
ocorrerá cerca de um milhão de vezes.fonte
Rotações.
Estou tentado a parar por aí! :-)
Considere este programa
A linha 1 é executada uma vez, enquanto a linha 3 é executada 10 vezes. Olhando cada linha por vez
Duas linhas representam 83% do tempo de execução (assumindo que todas as linhas demoram aproximadamente o mesmo tempo para serem executadas. Portanto, 40% do programa leva> 80%.
Com exemplos maiores e mais reais, isso aumenta e apenas uma pequena quantidade de linhas é responsável por grande parte do tempo de execução.
A regra 90/10 (ou como às vezes é 80/20) é uma "regra de ouro" - apenas aproximadamente verdadeira.
Veja também Princípio de Pareto
fonte
Como você perguntou apenas sobre o tempo de execução, este exemplo pode ser útil:
Para ser um pouco mais sério, significa que, no código da vida real, você quase sempre chama uma função pesada em um loop (em vez de
sleep(90);
), enquanto o restante, 10% do tempo, realiza alguns cálculos de passagem única.Outro exemplo é o tratamento de erros em alguns serviços de alta disponibilidade. Qualquer serviço altamente disponível é projetado para funcionar por uma quantidade infinita de tempo em condições normais. Ele opera normalmente 99% do tempo, mas ocasionalmente, em caso de erro, executa alguma manipulação e recuperação de erros, que podem ser ainda mais logicamente complexas do que o próprio serviço.
fonte
O raciocínio 90/10 significa que uma pequena parte do seu código será repetida ou usada mais do que outras. Isso geralmente é usado para sugerir que você concentre 90% do seu esforço de desenvolvimento / otimização nesses 10% do seu código.
Pense em um processador de texto normal, como o Microsoft Word ou o OpenOffice :
Esse ditado também é usado nas ciências da administração ... Esta é uma lição para a própria vida ... Significado: concentre a maior parte de seus esforços, a fim de obter mais resultados.
fonte
Imagine um programa como este:
Observe como existem 11 linhas aqui onde 3 dos 11 são o loop for, onde quanto tempo é gasto nesse pequeno pedaço de código? Um pouco enquanto as outras 8 linhas estão apenas imprimindo um único caractere. Portanto, lembre-se de que, embora um código possa ser curto, isso não indica com que frequência ele é executado e quanto tempo levará.
fonte
Além do loop, como mencionado por outras ótimas respostas, também existem princípios DRY a serem considerados. Bem escrito, o código orientado a objetos tem muitas partes reutilizáveis. As partes que são reutilizadas, por definição, são usadas pelo menos duas vezes mais que algo que é executado apenas uma vez. Se você tiver muito código OO, poderá potencialmente reutilizar algumas classes e métodos várias vezes e alguns outros pedaços de código apenas uma vez.
Como mencionado em outras respostas, provavelmente é melhor gastar esforços para tornar o código usado com mais frequência melhor do que melhorar o código usado apenas uma única vez.
fonte
Isso não é uma regra, é apenas um cara que editou a Wikipedia com alguns números retirados do nada e a chamou de regra. Compare com o Princípio de Pareto, que é mais firmemente estabelecido em outros contextos. Eu gostaria de ver quais pesquisas foram feitas (se houver) sobre a precisão dessa "regra".
Mas basicamente a resposta para sua pergunta é: algum código é executado com muito mais frequência do que outro código. Loops são frequentemente a razão disso. Outras razões são chamadas demoradas, por exemplo, para recursos externos, como serviços da Web ou mídia de armazenamento.
fonte
É uma reinterpretação do "princípio de Pareto", que afirma "para muitos eventos, aproximadamente 80% dos efeitos vêm de 20% das causas.", Também conhecida como regra 80/20. Essa regra é aplicada principalmente à economia, por isso faz sentido que ela seja proposta novamente para a programação.
É apenas um padrão que foi observado por um longo período de tempo.
Aqui está um vídeo muito bom sobre padrões como este, e também explica o Princípio de Pareto.
https://www.youtube.com/watch?v=fCn8zs912OE&ab_channel=Vsauce
fonte