4 bilhões de instruções if
- Ao pesquisar redes sociais recentemente, encontrei este screenshot dentro de um trem.
- Este código é um exemplo perfeito de trade-off entre tempo e memória.
- A ideia era implementar isso em C para aumentar o desempenho.
Estrutura do código
- Foi escrito um código em C para determinar se um número é par ou ímpar.
- Ele foi compilado com as otimizações desativadas.
- Funciona normalmente para números de 0 a 10, mas apresenta problemas para valores maiores.
Metaprogramação
- Usou-se Python para fazer metaprogramação das instruções if.
- Foi gerado um programa para determinar paridade em inteiros de 8 bits.
Expansão para 16 bits
- O programa foi expandido da mesma forma para inteiros de 16 bits.
- Foi gerado e compilado um arquivo C com cerca de 130 mil linhas.
Desafio dos 32 bits
- Houve uma tentativa de expandir o programa para inteiros de 32 bits.
- Foi gerado um arquivo C de 330 GB, mas o compilador falhou por falta de espaço no heap.
- Devido aos limites do formato Portable Executable, não foi possível lidar com arquivos maiores que 4 GB.
Escrevendo código de máquina diretamente
- A função
IsEven foi escrita diretamente em assembly x86-64.
- Python foi usado para compilar manualmente o código de máquina.
Geração do executável
- Foi criado um arquivo de 40 GB para determinar paridade para todos os inteiros de 32 bits.
- O arquivo foi mapeado em memória e o código foi executado usando um ponteiro de função.
Correção final de bug
- A função
strtoul foi usada no lugar da anterior para resolver um problema ao fazer parse de inteiros sem sinal.
- O programa é muito rápido e retorna resultados em menos de 10 segundos mesmo para números grandes.
Opinião do GN⁺
- Importância: Este texto ajuda a entender o trade-off entre tempo e memória, um conceito básico de programação. Também é um bom exemplo de como código não otimizado afeta o desempenho real.
- Interessante: É interessante acompanhar a exploração experimental das diferenças de desempenho entre linguagens e dos limites do compilador. Em especial, a tentativa de melhorar a performance comparando Python e C é divertida.
- Lição: O texto mostra que, para resolver problemas complexos, abordagens que às vezes parecem ineficientes podem na prática ser úteis. Também reforça a importância de buscar soluções criativas em ciência da computação.
1 comentários
Comentários do Hacker News
Resumo do primeiro comentário:
Resumo do segundo comentário:
Resumo do terceiro comentário:
is-eveneis-odd.npm installfaria o download de um pacote de 40 GB.Resumo do quarto comentário:
Resumo do quinto comentário:
Resumo do sexto comentário:
Resumo do sétimo comentário:
Resumo do oitavo comentário:
Resumo do nono comentário:
libdivide.Resumo do décimo comentário: