2010-12-29 4 views
1

저는 여러 팀의 Mercurial 리포지토리를 우리 팀이 사용하는 방식으로 쉽게 관리 할 수 ​​있도록 C#으로 유틸리티를 작성하고 있습니다. 그러나 hg.exe에서 다시 돌아 오기 전에 항상 300 ~ 400 밀리 초의 지연이있는 것으로 보입니다. 아래의 코드를 사용하여 hg.exe 및 hgtk.exe (TortoiseHg의 GUI)를 실행합니다. 이 코드에는 현재 스톱워치와 타이밍을위한 변수가 포함되어 있습니다. 동일한 세션 내에서 여러 번 실행하면 지연이 거의 같습니다. 나는 또한 hg.exe의 정확한 경로를 지정하려고 시도했으며 동일한 결과를 얻었다.Mercurial CLI가 C#에서 느립니다?

static string RunCommand(string executable, string path, string arguments) 
{ 
    var psi = new ProcessStartInfo() 
    { 
     FileName = executable, 
     Arguments = arguments, 
     WorkingDirectory = path, 

     UseShellExecute = false, 
     RedirectStandardError = true, 
     RedirectStandardInput = true, 
     RedirectStandardOutput = true, 

     WindowStyle = ProcessWindowStyle.Maximized, 
     CreateNoWindow = true 
    }; 

    var sbOut = new StringBuilder(); 
    var sbErr = new StringBuilder(); 

    var sw = new Stopwatch(); 

    sw.Start(); 

    var process = Process.Start(psi); 

    TimeSpan firstRead = TimeSpan.Zero; 

    process.OutputDataReceived += (s, e) => 
    { 
     if (firstRead == TimeSpan.Zero) 
     { 
      firstRead = sw.Elapsed; 
     } 

     sbOut.Append(e.Data); 
    }; 
    process.ErrorDataReceived += (s, e) => sbErr.Append(e.Data); 

    process.BeginOutputReadLine(); 
    process.BeginErrorReadLine(); 

    var eventsStarted = sw.Elapsed; 

    process.WaitForExit(); 

    var processExited = sw.Elapsed; 

    sw.Reset(); 

    if (process.ExitCode != 0 || sbErr.Length > 0) 
    { 
     Error.Mercurial(process.ExitCode, sbOut.ToString(), sbErr.ToString()); 
    } 

    return sbOut.ToString(); 
} 

내가 어떻게 처리 할 수 ​​있는지에 대한 아이디어가 있습니까? 그것이 그렇듯이 UI 스 니 핑을 유지하기 위해 스레딩에 더하여 많은 캐싱 작업을해야 할 것입니다.

+0

당신이 아무것도 돌려 받기 전에 지연이 있다고 말하면,이 지연은 프로그램이 완료해야하는 시간만큼 동일합니까? 또는 임의의 명령이 명령 행에서 실행하는 것보다 프로그램을 실행하는 데 3 ~ 400 밀리 초가 더 걸립니까? hg가 더 느리게 실행되는 것을 경험했다고 말할 수는 없지만 출력에 캐싱이있는 것 같습니다. 즉, 버퍼가 나중에 어느 시점에 채워지는 경우에만 내 프로그램이 hg에서 hg의 텍스트를 새로운 행으로 가져 오지 않는 것으로 보입니다. –

+0

또한 셀프 커머셜에 대한 충동에도 저항 할 수 없습니다. Mercurial을 래핑하기 위해 아직 완성되지 않은 클래스 라이브러리를 만들었습니다. 프로그램을 실행하는 영역에 명백한 차이가 있는지 확인하기 위해 내 코드를 점검 할 수 있습니다. 몇 가지 타이밍 테스트를 지금하겠습니다.하지만 내 단위 테스트가 오래 걸리지 않으므로 지연이 없다고 생각합니다. http://mercurialnet.codeplex.com/ –

+0

커맨드 라인에서 얼마나 오랜 시간이 걸릴지 모르겠다. 나는 26 개가있을 때 300+ ms가 용납 될 수 없다는 것을 알고있다. 여러 명령을 실행하는 리포지토리 각각의 지점이 어느 지점에 있는지를 파악하는 데 거의 9 초가 걸리고 병합이 필요한 헤드가 있는지 확인해야합니다. – Taudris

답변

2

음, 여기 거래가 있습니다.

수은 명령 줄 프로그램에는 오버 헤드가 포함되어 있습니다.

이 명령을

hg --quiet version 

전혀 저장소에 보이지 않는, 실행 내 컴퓨터에서 평균 195ms 소요됩니다. 리포지토리와 변경 집합을 시작할 때이 값을 0에 훨씬 가깝게 최소화 할 수는 없습니다.

왜 26 개의 리포지토리가 있습니까? 왜 그들이 어떤 지점에 있는지 알아야합니까? 동시에 지사와 여러 저장소를 사용하고 있습니까?

+0

예, 여러 개의 저장소와 명명 된 분기를 사용하고 있습니다. 코드는 서로 다른 프로젝트에서 여러 조합으로 사용되는 여러 라이브러리로 나누어 져 있으므로 별도의 리포지토리에 보관하고 있습니다. 한 프로젝트의 특정 지사가 다른 프로젝트의 지사 목록을 어지럽히는 것을 원하지 않습니다 ... – Taudris

+0

sub-repos는 어떨까요? –