Ich habe eine sehr große Menge von Binärdateien, wo mehrere tausend rohe Frames von Video sequenziell gelesen und verarbeitet werden, und ich bin jetzt auf der Suche nach optimieren, wie es scheint, mehr CPU-gebunden als I/O-gebunden.. NET Binärdatei lesen Leistung
Die Rahmen werden derzeit auf diese Weise gelesen, und ich vermute, dies ist der größte Übeltäter ist:
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);
es einen großen Unterschied in .NET Würde die I/O neu zu organisieren, um zu vermeiden, Erstellen all dieser neuen Byte-Arrays mit jedem Frame?
Mein Verständnis von .NET-Speicherzuordnungsmechanismus ist schwach, da ich von einem reinen C/C++ - Hintergrund komme. Meine Idee ist, dies neu zu schreiben, um eine statische Pufferklasse zu teilen, die einen sehr großen geteilten Puffer mit einer Ganzzahl enthält, die die tatsächliche Größe des Rahmens verfolgt, aber ich mag die Einfachheit und Lesbarkeit der aktuellen Implementierung und würde sie lieber behalten, wenn CLR behandelt das bereits auf eine Weise, die mir nicht bewusst ist.
Jeder Eingang würde sehr geschätzt werden.
Haben Sie einen Profiler ausgeführt, um sicherzustellen, dass der Leistungseinbruch nicht aus anderen Quellen stammt? Oder bist du einfach gegangen und hast angenommen "So ist es wahrscheinlich"? –
Hallo David, Ich lief den Leistungsprofiler darauf ein paar Mal und diese bestimmte Methode ist meine teuerste. Daher schaue ich, ob diese "new byte []" Methode ein offensichtlicher Performance-Killer in .NET ist. Als C-Programmierer sieht dies analog zu Tausenden von "malloc" -Anweisungen für jeden Puffer aus, was definitiv langsamer als ein wiederverwendetes Puffer wäre. – rnd