Crie um código-fonte curto no seu idioma compilado favorito, compilado em um arquivo executável grande (não inferior a 104857600 bytes). O programa deve ser executável (assumindo 1 GB de memória livre) e pode fazer qualquer coisa (de preferência algo simples como um olá mundo).
O uso de truques não óbvios é incentivado.
Exemplo chato em C:
int a[1024*1024*25] = { 1 };
int main(){}
Pontos de bônus se puder ser "explicado" por que o executável não pode ser reduzido em tamanho (ou seja, todo o inchaço é realmente usado de alguma forma).
Respostas:
OK, aqui está outro em C, buscando os pontos de bônus vagamente definidos:
Basicamente, no tempo de compilação, ele cria uma sequência crescente de números inteiros de 0 a 2 25 - 1. No tempo de execução, verifica se a sequência realmente contém os valores esperados e, se não, retorna um código de erro diferente de zero.
Ps. Se eu fiz minhas contas corretamente, o executável deve ter mais de 100 MiB. Avisarei o tamanho exato assim que terminar de compilar ...
fonte
virtual memory exhausted: Cannot allocate memory
. o_O Tentarei ajustar as opções para ver se consigo compilar de alguma forma.clang
(ICE) etcc
.-O0
) para minimizar as demandas do compilador, e habilitar pipes (-pipe
) pode ou não ajudar.C #
Não tenho certeza se isso é qualificado como curto, porque o código-fonte acabou sendo> 30k :)
Ou seja, grande demais para citar. Aqui está uma versão ligeiramente reduzida
O código que eu realmente compilei pode ser encontrado aqui: http://pastebin.com/R5T3e3J0
Isso criará um arquivo .EXE de ~ 45KiB quando compilado sem otimizações. Compile-o novamente com o Ngen.exe (Native Image Generator) e ele se tornará um 104MiB!
Isso funciona devido ao funcionamento do sistema de tipo genérico CLR. Cada lista <> no código acima irá gerar uma nova declaração de tipo (normalmente através da compilação JIT, mas o Ngen executa a compilação AOT). Portanto, um tipo para Lista <int>, outro para Lista <Lista <int>> e assim por diante. Portanto, para esse código, um total de 5160 listas genéricas diferentes será criado.
fonte
COBOL
Um pouco de conhecimento pode ser uma coisa perigosa.
Pode ser mais rápido fazer uma comparação grande do que muitas pequenas comparações; O Enterprise COBOL da IBM (até a versão 4.2) pode ter um ARMAZENAMENTO DE TRABALHO máximo de 128 MB (a versão 5.0 pode ter 2 GB); O ARMAZENAMENTO LOCAL oferece mais 128 MB se você precisar de mais espaço.
A tarefa é confirmar que um pedaço de armazenamento de 11584 bytes tenha o valor "OLÁ! MUNDO!" em algum lugar, e o resto é espaço.
O programador, fictício, decide escrever um subprograma para isso (apenas no caso de ser necessário em outro lugar) e incluir sua técnica de alto desempenho (bônus).
O programador calcula que 11584 * 11584 tem 128 MB, portanto usa WORKING-STORAGE para uma tabela enorme e LOCAL-STORAGE para tudo o que for necessário.
O programador codifica e sorri conscientemente para si mesmo quando a compilação está limpa. Eles estavam certos quanto aos 128MB.
Testa o código. Funciona. Possivelmente um pouco lento, mas há uma carga pesada na máquina. Sorri novamente, pensando em quão lento seria se codificado sem o nível de conhecimento especializado deles.
O ARMAZENAMENTO DE TRABALHO chega a 134.189.056 bytes, e também existem alguns bytes de outras coisas. Deve ser grande o suficiente.
A realidade é que fazer uma comparação longa em vez de uma comparação curta, conforme implementado aqui, é uma maneira muito lenta de fazê-lo.
Ainda mais lento, o LOCAL-STORAGE, que é inicializado por rotinas de tempo de execução toda vez que um subprograma é chamado, faz com que todos os 128MB sejam configurados para cada CHAMADA.
O programador estava completamente errado sobre o tamanho da tabela, há espaço suficiente sem usar LOCAL-STORAGE. As comparações longas podem superar as comparações curtas, mas apenas quando o número real de comparações é reduzido.
Eu considerei trocar o LOCAL-STORAGE e o WORKING-STORAGE, é muito menos provável que alguém o codifique dessa maneira, então não o fiz. Colocar um VALUE SPACE na mesa (se estivesse em LOCAL-STORAGE) teria iniciado a tabela duas vezes em cada CHAMADA, de forma ainda mais lenta.
O Bloat não pode ser removido sem reescrever o programa. A maior parte do código é ruim, embora exista uma técnica útil.
Este não é um exemplo da vida real, mas posso imaginar alguém fazendo isso, se alguém for inteligente o suficiente :-)
Compilar não é problema. Executá-lo com todas as possibilidades rapidamente prova que não vale a pena tentar.
Obviamente, também existe um velho bug comum. Muito comum em tarefas de "pesquisa".
fonte
PowerBASIC
fonte
Scala
A anotação especializada cria uma nova classe para cada tipo, a fim de impedir o encaixotamento quando todos os tipos acabarem sendo transformados em objetos. Ele criará 10 ^ 8 ((
Everything
consiste em 10 tipos) ^ (8 parâmetros de tipo na classe)) arquivos de classe, cada 300-500 bytes, se não travar primeiro.Isso pode ser explicado dizendo que o desempenho é importante, especialmente se a classe realmente fez mais do que ter um método para imprimir. Usar métodos especializados genéricos em vez de colocar tudo na declaração também tornaria mais difícil perceber
fonte
Javascript
Execute esse código no Console do navegador nesta página e, quando concluído, salve a página. deve resultar em um tamanho de arquivo maior que 100 MB. Ainda testando. Será publicado o tamanho real, uma vez feito.
update-
a página salva é o resultado executável. O mecanismo v8 do chrome é o compilador. E o código que publiquei é o programa. admito que demora muito para compilar. : D
fonte