Tengo un gran conjunto de archivos binarios donde miles de marcos de video sin formato se están leyendo y procesando secuencialmente, y ahora estoy buscando optimizarlo ya que parece estar más vinculado a la CPU que enlazado a E/S..NET Binary File Read Performance
Los marcos se están leyendo actualmente de esta manera, y sospecho que este es el mayor culpable:
private byte[] frameBuf;
BinaryReader binRead = new BinaryReader(FS);
// Initialize a new buffer of sizeof(frame)
frameBuf = new byte[VARIABLE_BUFFER_SIZE];
//Read sizeof(frame) bytes from the file
frameBuf = binRead.ReadBytes(VARIABLE_BUFFER_SIZE);
¿Sería hacer mucha diferencia en .NET para volver a organizar el I/O para evitar creando todos estos nuevos arrays de bytes con cada cuadro?
Mi comprensión del mecanismo de asignación de memoria de .NET es débil ya que provengo de un fondo puro de C/C++. Mi idea es volver a escribir esto para compartir una clase de búfer estática que contiene un búfer compartido muy grande con un entero que hace un seguimiento del tamaño real del marco, pero me encanta la simplicidad y legibilidad de la implementación actual y preferiría mantenerla si el CLR ya maneja esto de alguna manera que no conozco.
Cualquier entrada sería muy apreciada.
¿Ha ejecutado un generador de perfiles para asegurarse de que el rendimiento no proviene de otras fuentes? ¿O simplemente fue y asumió "Entonces, eso es probablemente"? –
Hola David, Ejecuto el perfilador de rendimiento unas pocas veces y este método en particular es el más caro. Por lo tanto, estoy buscando para ver si este método de "nuevo byte []" es un asesino de rendimiento obvio en .NET. Como programador en C, esto parece análogo a miles de declaraciones "malloc" para cada buffer, que definitivamente sería más lento que un buffer reutilizado. – rnd