![]() |
Creado por Thiago Russo
hace más de 7 años
|
|
Pregunta | Respuesta |
Limpando seu material Vc criou seu primeiro app Windows 8. É um jogo q permite aos usuários gravar um vídeo de si mesmos descrevendo uma palavra. Outros têm que adivinhar; Dessa forma, eles podem ganhar pontos q lhes permitam criar um vídeo mais longo. Um dia vc acorda e percebe q a Microsoft escolheu o seu aplicativo como app da semana. Seu servidor web q está rodando toda a lógica do jogo está tremendo sob a carga do usuário por causa da súbita popularidade. Ambos as pressões de memória e CPU são muito mais elevados do q o esperado. Vc tem alguns tipos q são qualificados para ser um tipo de valor, mas no momento de criar seu app, você usou classes. 1. Como pode utilizar os tipos de valor qdo possível melhorar o seu desempenho? Ou poderia ser que seu desempenho irá deteriorar-se mais? | 1. Tipos de referência estão no heap e são gerenciados pelo coletor de lixo. Tipos de valor estão na stack a maior parte do tempo e são liberados qdo o método atual termina. Qdo um tipo de valor está na stack, ele ocupa menos memória do que seria na heap. No entanto, se um tipo de valor está dentro de um tipo de referência, ele ainda está na heap. A alteração do tipo para um struct há garantia de q a sua pressão de memória vai cair. |
2. Por que implementar IDisposable é importante para reduzir a pressão de memória? É sempre melhor chamar Dispose em um elemento, assim que você terminar com ele? | 2. IDisposable oferece uma maneira de liberar explicitamente recursos n gerenciados e vc n terá q esperar para o coletor de lixo para liberar memória. No entanto, chamar Dispose é algo que custa tempo de CPU. Ao deixar as coisas para o coletor de lixo, o GC irá decidir qdo é o melhor momento para começar a chamar finalizadores. Existe um compromisso para estabelecer entre explícitamente ou implicitamente, liberando seus recursos. |
3. Você deve implementar um finalizador em todos os seus tipos que implementam IDisposable? | 3. Uma classe que implementa IDisposable deve ter alguns recursos não gerenciados. Um finalizador é importante para se certificar de q um item sempre libera os recursos não gerenciados, mesmo quando Dispose não é chamado. No entanto, uma classe com um finalizador é tratada de um modo especial. O objeto é adicionado a uma fila de finalização e é mantido na memória até que o finalizador ser executado. É importante certificar-se de que, quando Dispose é chamado, o objeto é explicitamente removido da fila de finalização. |
4. Você tem alguns itens que são usados muito. Seria sábio colocá-los em um campo estático para que você não tem que recriá-las cada vez? | Um campo estático é uma referência raiz; o GC nunca vai liberar um objeto que é referenciado por um campo estático. Neste caso, seria melhor usar um cache que mantém o controle de quais objetos devem ser mantidos na memória. Um algoritmo de caching que decide sobre a frequência com que um objeto é acessado pode ter certeza de que seus objetos estão ao redor. No entanto, quando há uma falta de memória, o cache pode transformar alguns objetos em WeakReferences e certifique-se que eles podem ser lixo coletado. |
¿Quieres crear tus propias Fichas gratiscon GoConqr? Más información.