Fazer objetos imutáveis que mudam constantemente a memória / performance de impacto?

5

Eu estou escrevendo um programa que entra em um loop e continua mudando o estado de alguns modelos (semelhante a um jogo). Naturalmente, muitas coisas são mutáveis. No entanto, também estou escrevendo algumas classes que são imutáveis porque são inerentemente tratadas como valores (por exemplo: vetores, matrizes, etc.)

No entanto, esses valores mudam em cada loop (talvez 50 a 100 vezes por segundo). Isso significa que em cada mudança, o programa precisaria alocar um novo pedaço de memória? Se eu estiver usando código gerenciado, isso significa que o uso da memória se acumulará muito rapidamente? Como isso afeta o determinismo, o desempenho e a coleta de lixo em linguagens como C # e Java, especialmente quando muitos coletores de lixo precisam pausar todo o programa para limpar a memória?

    
por 9a3eedi 17.07.2014 / 12:02
fonte

2 respostas

2

Todos structs são alocados na pilha ou fazem parte da memória de conter class . Mesmo se você alocar milhões de estruturas, isso não afetará a memória. Por outro lado, a passagem de grandes estruturas por valor (não por referência) pode afetar o desempenho, porque é copiado toda vez.

Por outro lado, a alocação de novo class pode afetar o consumo de memória, porque new class instance = new allocated memory. Além disso, isso pode afetar o desempenho, porque o GC precisa rastreá-lo e descartá-lo. Existem algumas otimizações, como o Generational GC, mas se você realmente precisa de desempenho, é melhor gerenciar a memória por conta própria.

    
por 17.07.2014 / 15:29
fonte
2

Se você precisar de algo que se comporta como um grupo de variáveis independentes, mas relacionadas, ligadas com fita adesiva (por exemplo, as coordenadas de um vetor), use uma estrutura campo exposto . Os campos de uma estrutura de campo exposto são mutáveis quando a estrutura é armazenada em um local mutável e imutável quando o local de armazenamento é armazenado em um local imutável.

Como uma estrutura de campo aberto se comporta como um conjunto de variáveis independentes, mas algumas relacionadas, algumas pessoas acham que tudo deveria se comportar como um objeto como "malvado". Eu diria que, embora as estruturas de campo aberto ou mutáveis em geral não sejam adequadas em lugares que exigem algo que se comporta como um objeto, elas se encaixam perfeitamente em lugares onde é necessário agrupar variáveis com fita adesiva.

É possível usar objetos de classe imutáveis para armazenar grupos de valores independentes, mas relacionados. Pode até mesmo ser vantajoso nos casos em que valores compostos (isto é, combinação particular de valores) serão transmitidos com muito mais frequência do que são criados. Por outro lado, se o código que contém uma referência a um vetor (34,39) quiser manter uma referência a um vetor cujo componente x é maior, ele não poderá simplesmente incrementar um campo (como poderia uma estrutura), mas deve criar um objeto vetorial inteiramente novo (35,39). O custo de desempenho de fazer isso não será um problema se você nunca tiver que executar tais operações repetidamente dentro de um loop interno. Por outro lado, se um programa executasse freqüentemente loops significativos cuja finalidade principal envolvesse a construção de versões ligeiramente modificadas de objetos, o tempo necessário para construir tais objetos poderia se tornar uma fração substancial do tempo total de execução.

    
por 21.07.2014 / 23:30
fonte