2012-03-16 2 views
7

IEnumerableIObservable과 어떻게 다른지 궁금합니다. 나는 pull과 push 패턴을 각각 이해하지만 C#은 메모리 등에서 가입자에게 (IObservable의 경우) 처리 할 메모리의 다음 비트 데이터를 받아야한다고 어떻게 알 립니 까? 관찰 된 인스턴스는 구독자에게 푸시 할 데이터가 변경되었음을 어떻게 알 수 있습니까?IEnumerable과 IObservable의 차이점은 무엇입니까?

제 질문은 파일에서 줄을 읽는 중 테스트에서 온 것입니다. 파일은 총 6Mb 정도였습니다.

표준 시간 촬영 : 4.7s, 선 : 36,587

수신 시간 촬영 : 0.68s, 선 :

36587 어떻게 대규모 파일의 각 라인을 통해 정상 반복을 향상시킬 수 수신입니다 ?

private static void ReadStandardFile() 
{ 
    var timer = Stopwatch.StartNew(); 
    var linesProcessed = 0; 

    foreach (var l in ReadLines(new FileStream(_filePath, FileMode.Open))) 
    { 
     var s = l.Split(','); 
     linesProcessed++; 
    } 

    timer.Stop(); 

    _log.DebugFormat("Standard Time Taken: {0}s, lines: {1}", 
     timer.Elapsed.ToString(), linesProcessed); 
} 

private static void ReadRxFile() 
{ 
    var timer = Stopwatch.StartNew(); 
    var linesProcessed = 0; 

    var query = ReadLines(new FileStream(_filePath, FileMode.Open)).ToObservable(); 

    using (query.Subscribe((line) => 
    { 
     var s = line.Split(','); 
     linesProcessed++; 
    })); 

    timer.Stop(); 

    _log.DebugFormat("Rx Time Taken: {0}s, lines: {1}", 
     timer.Elapsed.ToString(), linesProcessed); 
} 

private static IEnumerable<string> ReadLines(Stream stream) 
{ 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     while (!reader.EndOfStream) 
      yield return reader.ReadLine(); 
    } 
} 
+0

이 애플리케이션을 벤치마킹 할 때 통화 순서를 변경하면 RX가 여전히 더 빠릅니까? – user7116

+0

시간이 뒤 바뀌 었습니다! 어떤 종류의 최적화가 진행 중입니다! 사실, Rx는 느리게 작동합니다 (약 5 초). – David

답변

5

내 직감은 파일을 캐싱하는 OS가 반영된 것입니다. 나는 전화의 순서를 바꾸면 비슷한 속도의 차이를 보았을 것입니다. 그냥 바꿔 치기 만하면됩니다.

몇 가지 예열 실행을 수행하거나 입력 파일을 테스트하기 전에 File.Copy을 사용하여 임시 파일로 복사하여이 벤치 마크를 개선 할 수 있습니다. 이 방법은 파일이 "뜨겁지"않을 것이며 공정한 비교를 얻을 수 있습니다.

+0

수정. 예, 캐싱이 일어나고있는 것처럼 보입니다. – David

+0

10MB 또는 25Mb의 파일에 대한 속도면에서 큰 차이가 없으며 그 이후 표준에서는 무작위로 생성 된 데이터를 쉼표로 100MB까지 (최대 테스트 한)까지 케이크 (4 배속)를 사용합니다. 여기에는 JIT가 실제 결과가 제공되기 전에 각 방법을 3x 실행하여 "워밍업"할 수 있도록 허용되었습니다. 모든 벤치 마크와 마찬가지로, 그것은 귀하의 운영 환경에 따라 다릅니다. – user7116

1

저는 CLR의 내부 최적화에 대해 알고 있다고 생각합니다. 그것은 아마도 두 개의 호출 사이에 메모리에 파일의 내용을 캐시하므로 ToObservable이 훨씬 빨리 내용을 가져올 수 있습니다 ...

편집 : 오, 미친 닉네임 eeh와 좋은 동료 ... @sixlettervariables 빠르고 아마 맞을 것입니다. CLR보다 최적화 된 OS가 있습니다.

관련 문제