Possiedo un insieme molto grande di file binari in cui diverse migliaia di frame grezzi di video vengono letti e elaborati in sequenza, e ora sto cercando di ottimizzarlo in quanto sembra essere più legato alla CPU di I/O-bound.Prestazioni di lettura file binari .NET
I telai sono attualmente in fase di lettura in questo modo, e ho il sospetto questo è il più grande colpevole:
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);
farebbe molta differenza in .NET per ri-organizzare l'I/O di evitare creando tutti questi nuovi array di byte con ogni frame?
La mia comprensione del meccanismo di allocazione della memoria di .NET è debole poiché provengo da uno sfondo puro C/C++. La mia idea è di riscrivere questo per condividere una classe di buffer statico che contiene un buffer condiviso molto grande con un intero che tiene traccia delle dimensioni effettive del frame, ma adoro la semplicità e la leggibilità dell'attuale implementazione e preferisco tenerlo se il CLR lo gestisce già in un modo che non conosco.
Qualsiasi input sarebbe molto apprezzato.
Hai eseguito un profiler per garantire che il rendimento non provenga da altre fonti? O sei appena andato e hai pensato "Quindi è probabile?" –
Ciao David, Ho eseguito il profiler delle prestazioni su di esso alcune volte e questo particolare metodo è il più costoso. Pertanto, sto cercando di vedere se questo metodo "new byte []" è un evidente killer delle prestazioni in .NET. Come programmatore C, questo sembra analogo a migliaia di istruzioni "malloc" per ciascun buffer, che sarebbe sicuramente più lento di un buffer riutilizzato. – rnd