我的测试似乎暗示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 +秒。可能这些命令中没有一个是需要响应的命令,但它已经为系统添加了几秒钟的缓慢。