2013-06-18 1 views
0

내 프로젝트의 경우 파일에서 UInt16, UInt32, Bytes 및 String을 작성해야합니다. 나는 다음과 같이 썼다 간단한 클래스로 시작 : 나는 비록 기존 BinaryReader를를 사용하는 것이 더 될 줄 알았는데 그래서 나는 그것을 시도C# BinaryReader가 특히 느립니다. 대체?

public FileReader(string path) //constructor 
    { 
     if (!System.IO.File.Exists(path)) 
      throw new Exception("FileReader::File not found."); 

     m_byteFile = System.IO.File.ReadAllBytes(path); 
     m_readPos = 0; 
    } 
    public UInt16 getU16() // basic function for reading 
    { 
     if (m_readPos + 1 >= m_byteFile.Length) 
      return 0; 

     UInt16 ret = (UInt16)((m_byteFile[m_readPos + 0]) 
          + (m_byteFile[m_readPos + 1] << 8)); 
     m_readPos += 2; 
     return ret; 
    } 

,하지만 난 내 방식보다 느린 것으로 나타났습니다. 누군가가 왜 이것이지 설명 할 수 있고 파일을로드하고 읽는 데 사용할 수있는 다른 기존 클래스가 있다면?

~ Adura

+0

테스트를 어떻게하셨습니까? 중요한 것은 BinaryReader에서 데이터가 조금씩 읽히기 때문에 모든 데이터를 읽는 데 걸리는 시간을 코드에 포함 시켰습니까? 또한, 빠른 속도로이 코드가 필요합니까? –

+0

속도 : 바이너리 파일에서 이미지를 읽었으며 "이미지 뷰어"에서 브라우징 할 때 모든 이미지를 보여주는 데 차이가 있다는 것을 느낄 수있었습니다. BinaryReader의 개체를 작성하거나 파일을 읽는 데 걸리는 시간은 두 경우 모두 기본적으로 즉시이므로 무시할 수 있습니다. 새 이미지를 선택할 때마다 최대 4000 바이트를 읽었으므로 속도가 빨라야합니다. 내가 생각하기에 메모리 스트림 솔루션이 이상적이다. – Adura

+0

요점은 BinaryReader *를 만들면 파일을 읽지 못한다는 것입니다. 필자는 File.ReadAllBytes가 "기본적으로 즉시"라는 것을 매우 의심합니다. MemoryStream을 사용하여 수행 한 작업은 모두 프런트로드 작업입니다. 나는 당신이 퍼포먼스를 측정하고있는 것을보고 관심을 가질 것입니다. –

답변

1

BinaryReader 내가 디스크에있는 파일 추측 소스에서 한 번에 하나의 바이트 스트림 반면, 당신은 메모리에 배열의 모든 데이터 선행있다. 난 당신에게 메모리 배열에서 읽는 스트림 통과하여 속도를 높일 수있는 것 같아요 :이 방법을 사용하면 한 번에 메모리에 전체 파일을 작성해야한다는

Stream stream = new MemoryStream(byteArray); 
//Pass the stream to BinaryReader 

주하지만 난 그에 대한 확인 같아요 당신.

+0

_This_ 접근 방식은 내 시도와 동일한 성능을 제공하는 것으로 보이지만 이미 예외가 있으므로 함께 사용하게 될 것입니다. 감사합니다. . – Adura