C#Process.Start()性能

时间:2017-05-06 01:43:31

标签: c#

我的测试似乎暗示Process.Start()的裸骨成本约为15-27ms(取决于你是否使用CreateNoWindow,ADDS~10ms)。在这个问题中,我并没有试图说我运行的代码很慢,而是启动流程的实际行为,即使它什么都不做。

我通过在控制台应用程序上使用秒表获得了这些数字,该应用程序运行另一个控制台应用程序,只是在其主要方法中返回。

namespace RunNothing
{
    class Program
    {
        static void Main(string[] args)
        {
            var startInfo = new ProcessStartInfo(@"C:\Users\Noggog\Documents\visual studio 2017\Projects\DoNothing\DoNothing\bin\Release\DoNothing.exe")
            {
                CreateNoWindow = true,
                UseShellExecute = false,
            };
            var sw = new Stopwatch();
            var proc = new Process()
            {
                StartInfo = startInfo,
                EnableRaisingEvents = true
            };
            proc.Exited += (sender, a) =>
            {
                sw.Stop();
                System.Console.WriteLine(sw.ElapsedMilliseconds);
            };
            sw.Start();
            proc.Start();
            System.Console.ReadLine();
        }
    }
}

所以我的问题是,是否有人知道改善每个Process.Start()调用启动时间的好方法?

对于后台,我有一个应用程序将启动各种.exes,其中大多数应该快速检查和短路,尽快。通常,其中一个呼叫会进行更长时间的操作,但通常它什么都不做。现在每次使用~15-27ms的呼叫对我的用例来说有点沉重。

编辑: 有些人要求提供最终用法的更多细节。 This is the project that drove the question.最终用法是git钩子的扩展,以提供更多可钩子命令,并提供便利功能,例如调用exe来响应被触发的钩子。其中一种模式是单个exe可以处理多个钩子,并决定它将响应哪些钩子。在那种情况下,每个git命令都会检查"用exe来看看它是否想要做任何逻辑。这是Process.Start()时间累加的地方。如果你有6个repos并且你的git客户端通过运行几个命令来初始化东西,则pre和post hook组合可以是27ms(proc开始时间)* 2(pre / post)* X(命令)* 6(repos)= ~2 +秒。可能这些命令中没有一个是需要响应的命令,但它已经为系统添加了几秒钟的缓慢。

0 个答案:

没有答案