저는 여러 팀의 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 스 니 핑을 유지하기 위해 스레딩에 더하여 많은 캐싱 작업을해야 할 것입니다.
당신이 아무것도 돌려 받기 전에 지연이 있다고 말하면,이 지연은 프로그램이 완료해야하는 시간만큼 동일합니까? 또는 임의의 명령이 명령 행에서 실행하는 것보다 프로그램을 실행하는 데 3 ~ 400 밀리 초가 더 걸립니까? hg가 더 느리게 실행되는 것을 경험했다고 말할 수는 없지만 출력에 캐싱이있는 것 같습니다. 즉, 버퍼가 나중에 어느 시점에 채워지는 경우에만 내 프로그램이 hg에서 hg의 텍스트를 새로운 행으로 가져 오지 않는 것으로 보입니다. –
또한 셀프 커머셜에 대한 충동에도 저항 할 수 없습니다. Mercurial을 래핑하기 위해 아직 완성되지 않은 클래스 라이브러리를 만들었습니다. 프로그램을 실행하는 영역에 명백한 차이가 있는지 확인하기 위해 내 코드를 점검 할 수 있습니다. 몇 가지 타이밍 테스트를 지금하겠습니다.하지만 내 단위 테스트가 오래 걸리지 않으므로 지연이 없다고 생각합니다. http://mercurialnet.codeplex.com/ –
커맨드 라인에서 얼마나 오랜 시간이 걸릴지 모르겠다. 나는 26 개가있을 때 300+ ms가 용납 될 수 없다는 것을 알고있다. 여러 명령을 실행하는 리포지토리 각각의 지점이 어느 지점에 있는지를 파악하는 데 거의 9 초가 걸리고 병합이 필요한 헤드가 있는지 확인해야합니다. – Taudris