Mercurial CLI работает медленно в C #? - PullRequest
1 голос
/ 30 декабря 2010

Я пишу утилиту на C #, которая упростит управление несколькими репозиториями Mercurial в зависимости от того, как ее использует моя команда.Тем не менее, кажется, что всегда есть задержка в 300-400 миллисекунд, прежде чем я получаю что-то от hg.exe.Я использую код ниже для запуска hg.exe и hgtk.exe (графический интерфейс TortoiseHg).Код в настоящее время включает в себя секундомер и некоторые переменные для целей синхронизации.Задержка примерно одинакова при нескольких запусках в одном сеансе.Я также попытался указать точный путь к hg.exe и получил тот же результат.

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();
}

Есть идеи, как мне ускорить процесс?Сейчас мне придется много кешировать в дополнение к многопоточности, чтобы сохранить пользовательский интерфейс.

1 Ответ

2 голосов
/ 30 декабря 2010

Ну, вот сделка.

Программа командной строки mercurial содержит служебные данные, вот и все.

Эта команда:

hg --quiet version

Который вообще не смотрит ни на один репозиторий, на моей машине в среднем уходит 195 мсек. Вы не сможете минимизировать это намного ближе к нулю, когда начнете использовать репозитории и наборы изменений.

Почему у вас 26 хранилищ? Зачем вам нужно знать, на какой ветке они находятся? Используете ли вы именованные ветви и несколько хранилищ одновременно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...