수천 개의 원본 비디오 프레임을 순차적으로 읽고 처리하는 매우 큰 이진 파일 집합이 있는데, CPU 사용률이 더 높은 것으로 보이는대로 최적화하려고합니다. I/O 바인딩보다.NET 이진 파일 읽기 성능
프레임이 현재이 방식으로 읽고, 나는 이것이 가장 큰 원인 인 것으로 생각되고있다 :
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);
그것을 방지하기 위해 I/O를 다시 구성 할 .NET에서 큰 차이를 만들 것 각 프레임마다 이러한 새로운 바이트 배열을 모두 생성합니까?
순수한 C/C++ 배경에서 왔기 때문에 .NET의 메모리 할당 메커니즘에 대한 이해가 약합니다. 내 생각은 프레임의 실제 크기를 추적하는 정수가 포함 된 매우 큰 공유 버퍼를 포함하는 정적 버퍼 클래스를 공유하기 위해 이것을 다시 작성하는 것이지만 현재 구현의 단순성과 가독성을 좋아하며 CLR은 이미 알고있는 어떤 방법으로 이것을 처리합니다.
모든 입력 사항을 보내 주시면 감사하겠습니다.
다른 소스에서 얻은 성능 저하를 방지하기 위해 프로필러를 실행 했습니까? 아니면 그냥 가서 "아마 그럴거야"라고 생각 했습니까? –
안녕 David, 성능 프로파일 러를 몇 번 실행했는데이 특정 방법이 가장 비싼 방법입니다. 따라서이 "새로운 byte []"메서드가 .NET에서 확실한 성능 킬러인지 확인하려고합니다. C 프로그래머로서, 이것은 각 버퍼에 대한 수천 개의 "malloc"문장과 비슷하게 보이는데, 이는 재사용 된 버퍼보다 확실히 느릴 것입니다. – rnd