Cómo reducir el uso de memoria del programa en desarrollo C#WPF

Recientemente desarrollé una aplicación con un uso de memoria relativamente alto. Espero reducir el uso de memoria de la aplicación, así que consulté el conocimiento relevante y lo resumí de la siguiente manera:
En el desarrollo de C#, si desea reducir el uso de memoria del programa , hay algunas estrategias de optimización comunes que puede consultar:

  1. Libere los recursos no utilizados de manera oportuna :
    libere los objetos no utilizados lo antes posible, especialmente los objetos grandes. Puede usar usingbloques de instrucciones para llamar automáticamente Disposea métodos para limpiar recursos no administrados.
    Por ejemplo:
using (var streamReader = new StreamReader("file.txt"))
{
    
    
    var content = streamReader.ReadToEnd();
    // 在using语句块结束时,streamReader的Dispose方法会被自动调用,释放其占用的资源
}
  1. Evite objetos grandes : evite crear objetos grandes, como matrices grandes, si es posible. Los objetos grandes se asignarán a la parte LOH (montón de objetos grandes) del montón. La memoria en esta parte no se comprimirá, lo que puede provocar la fragmentación de la memoria.
  2. Optimice las estructuras de datos : elija la estructura de datos más adecuada en función de sus necesidades y uso específicos. Por ejemplo, si el número de sus elementos de datos no será muy grande, List puede ser más eficiente en memoria que LinkedList.
  3. Tenga cuidado al usar tipos de valor y tipos de referencia : existe una clara diferencia en el uso de la memoria entre los tipos de valor (como struct) y los tipos de referencia (como class). Los tipos de valor generalmente se almacenan en la pila, mientras que los tipos de referencia se almacenan en el montón, y el recolector de elementos no utilizados debe reclamar los objetos en el montón.
public struct PointStruct // 值类型
{
    
    
    public double X, Y;
}

public class PointClass // 引用类型
{
    
    
    public double X, Y;
}
  1. Use el almacenamiento en caché con prudencia : el almacenamiento en caché puede mejorar el rendimiento del programa, pero si se usa incorrectamente, puede ser una fuente de fugas de memoria. Al usar el almacenamiento en caché, debe tener una política clara sobre cuándo y cómo borrar el caché.

  2. Evite pérdidas de memoria : asegúrese de que todos los controladores de eventos no estén registrados cuando no se necesiten y evite que los objetos de larga duración contengan referencias a objetos de corta duración.

public class EventPublisher
{
    
    
    public event EventHandler AnEvent;

    public void RaiseEvent()
    {
    
    
        AnEvent?.Invoke(this, EventArgs.Empty);
    }
}

public class Subscriber
{
    
    
    public void Subscribe(EventPublisher publisher)
    {
    
    
        publisher.AnEvent += OnEvent; // 订阅事件
    }

    public void Unsubscribe(EventPublisher publisher)
    {
    
    
        publisher.AnEvent -= OnEvent; // 在不需要时取消订阅,避免内存泄漏
    }

    private void OnEvent(object sender, EventArgs e)
    {
    
    
        // 处理事件
    }
}
  1. Optimización de operaciones con cadenas :
    si se trata de muchas operaciones con cadenas, considere usar StringBuilderen lugar de String. Debido Stringa que es inmutable, cada operación creará una nueva cadena, lo que puede causar un gran consumo de memoria. Finalmente, el uso de herramientas de diagnóstico como Visual Studio puede ayudarlo a comprender mejor el uso de memoria de su programa y encontrar posibles fugas de memoria y puntos de optimización.
var stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
    
    
    stringBuilder.Append(i); // 使用StringBuilder可以避免创建大量的临时字符串
}
var result = stringBuilder.ToString();

En el proceso principal, ¿el uso de Task aumentará el uso de memoria del programa?

Usar Task no necesariamente aumenta el uso de la memoria, depende de cómo use Task y la naturaleza de las operaciones que realice. Aquí hay algunos posibles factores contribuyentes:

  1. Número de tareas : si crea una gran cantidad de tareas al mismo tiempo, esto puede aumentar el uso de la memoria, ya que cada tarea ocupará algo de memoria para almacenar su estado y resultados.
  2. Operación de tareas : si cada tarea realiza alguna operación que consume mucha memoria (como el procesamiento de grandes cantidades de datos o la creación de objetos grandes), esto, por supuesto, aumentará el uso de la memoria.
  3. Paralelismo : en .NET, Task se basa en el grupo de subprocesos, y el grupo de subprocesos creará y reciclará subprocesos según sea necesario. Si la cantidad de tareas que crea excede la cantidad máxima de subprocesos en el grupo de subprocesos, el grupo de subprocesos puede crear más subprocesos para ejecutar tareas, lo que aumentará el uso de la memoria.
  4. Ciclo de vida de la tarea : si crea una tarea de ejecución prolongada y mantiene una referencia a ella hasta que finalice, la tarea no se puede recolectar como basura, lo que aumenta el uso de la memoria.

El uso de Task facilita la escritura de código asíncrono y paralelo, pero aún debe tener cuidado para administrar el uso de la memoria, especialmente cuando se procesan grandes cantidades de datos o se crean grandes cantidades de tareas. Al optimizar el uso de la memoria, el mejor enfoque suele ser identificar primero los puntos críticos de uso de la memoria con una herramienta de generación de perfiles, como las herramientas de diagnóstico de Visual Studio, y luego optimizar para esos puntos críticos.

Supongo que te gusta

Origin blog.csdn.net/weixin_38428126/article/details/131424609
Recomendado
Clasificación