2015-02-06 7 views
0

제 영어를 용서하십시오.XmlReader (Stream (fileName) -> MemoryStream)가 XmlReader (fileName)보다 느립니다.

큰 XML 파일 (> 2GB)을 읽고 싶습니다. 그것에 대해 여러 게시물을보고 XmlReader를 사용하는 것으로 파악했습니다. 테스트 목적

, 나는 500메가바이트 XML을 생성하고이 코드를 확인했다 :

XmlReader reader = XmlReader.Create(ofd.FileName); 
// work with reader 

가 ofd.FileName : 이름

먼저 하나

MemoryStream mem = new MemoryStream(); 
Stream file = File.OpenRead(ofd.FileName); 
file.CopyTo(mem); 
mem.Position = 0; 
file.Close(); 
XmlReader reader = XmlReader.Create(mem); 
// work with reader 

두 번째 하나를 xml 파일의 경로

독자와 작동 : 두 알고리즘에서 동일합니다.

내 RAM의 속도는 다음과 같습니다 15기가바이트/초 내 SSD의 속도는 다음과 같습니다 1백50메가바이트/초

내가 처음 알고리즘은 빠른 최소 100 시간으로 될 것이라고 생각했다. 그러나 실제로는 두 번째 알고리즘이 빠릅니다.

첫 번째 알고리즘 지속 시간 : 10500 밀리 초.

두 번째 알고리즘 지속 시간 : 9500 밀리 초.

왜? 프로그램이 첫 번째 알고리즘에서 여러 추상 레이어를 교차해야하기 때문입니까?

감사합니다.

+1

벤치마킹 방법에 대한 정보가 충분하지 않습니다. 1 초 또는 10 %의 차이는 JITter 예열이 될 수 있습니다. 적절한 벤치 마크를 수행하면 아마 똑같은 성능을 보일 것입니다. – CodeCaster

+1

첫 번째 경우에는 무엇을 측정하고 있습니까? (파일을 읽었는지 아닌지를 포함합니까?) 파일을 읽는 데 걸리는 시간이 포함되어 있다면 왜 "적어도 100 시간 이상 빠름"을 기대합니까? –

+0

@CodeCaster : var watch = Stopwatch.StartNew(); 알고리즘 이전에 및 : watch.Stop(); Console.WriteLine (watch.ElapsedMilliseconds); 알고리즘 후 – steacker

답변

1

XmlReader은 전진 전용 판독기이므로 MemoryStream 접근 방식을 사용하면 전체 파일을 정확히 두 번 통과하게됩니다.

두 번째 실행이 메모리에서 직접 발생한 경우에도 미리 버퍼링 할 때 "디스크"패널티가 있으므로 오버 헤드가 모든 데이터를 다시 실행합니다.

+0

맞습니다. 첫 번째 경우에는 파일을 두 번 읽는 것을 잊었습니다. copyTo는 1500 밀리 초 걸립니다. – steacker

+0

copyTo가 1500 밀리 초가 걸리면 "독자와 작업"이 9000 밀리 초가 걸린다는 것을 의미합니다. 두 번째 알고리즘보다 약간 빠릅니다. 이제 더 의미가 있습니다. 하지만 더 빨리 진행되지 않아야합니까? – steacker

+0

@steacker 운영체제는 파일 데이터를 미리 버퍼링하는 데 아주 능숙합니다. 후드 아래에서 어떤 일이 발생하는지 정확히 알지 못합니다. OS가 파일 데이터를 메모리에 보관하기로 결정하면 한 테스트가 다른 테스트에도 영향을 줄 수 있습니다. –