在 C# 中多次 运行 一个 exe 命令的最快方法是什么?

What is the fastest way to run an exe command many times in C#?

我的代码(用 C# 编写)运行多次使用 exe 命令(平均 800 次)。

目前我 运行 exe 命令作为 C# 中的 Process:

  var process1 = new Process()
  {
      StartInfo = new ProcessStartInfo()
      {
          FileName = "latex",
          Arguments = String.Format("-quiet -output-directory=\"{0}\" \"{1}\"", equationDirectory, equationTEX),
          WorkingDirectory = equationDirectory,
          CreateNoWindow = true,
          UseShellExecute = false,
          RedirectStandardError = true,
          RedirectStandardOutput = true
      }
  };
  process1.Start();

这花了很多时间,其中一些是 Windows 开始 shell 过程。

问题 我想知道在我的代码中 嵌入 和 运行 是否更快? 多次 运行 可执行文件的最快方法是什么(比方说在循环中)?

我不知道 运行ning 进程在 C# 中如何在低级别工作,但我不得不想象它不是很有效。您应该研究一些关于如何 运行 您的 exe 的抽象,尤其是您 运行 对它的使用量。想到的一个明显的方法是改用线程。

线程诞生于进程内部,因此它们共享父进程的地址 space。这减少了一些与内存分配相关的开销。它们在创建和销毁方面也更轻量级,这将极大地有益于您的 运行 时间。

运行线程内的代码有很多资源,环顾四周并尝试将其作为加速代码的替代方法。

可能是运行同时将它们全部连接起来迫使它们竞争资源,例如 - 用尽所有系统内存,导致对 HDD 进行分页。

也许使用类似下面的东西,并测试可以同时 运行 的数字,你会发现一个最佳点:

var processes = new List<Process>();

var process1 = new Process()
{
    StartInfo = new ProcessStartInfo()
    {
        FileName = "latex",
        Arguments = String.Format("-quiet -output-directory=\"{0}\" \"{1}\"", equationDirectory, equationTEX),
        WorkingDirectory = equationDirectory,
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardOutput = true
    }
};

//Add all of your processes to a list before actually running them
processes.Add(process1);

//This will run 5 in parallel
Parallel.ForEach(processes, new ParallelOptions { MaxDegreeOfParallelism = 5 }, p => { p.WaitForExit(); });

我之前使用的方法是简单地查看您的 Windows 资源 - 它很可能不受 CPU 限制,也可能不受 IO 限制。继续增加并行进程的数量,直到您看到这些值中的任何一个达到饱和。我的类似问题是一个过程(DirectX 效果编译器)需要 10 秒。在那 10 秒内,我的大部分资源都处于空闲状态(应用程序是按程序编写的,因此没有利用许多可用的内核)。在该列表上创建任务列表和 WaitAll() 从根本上减少了总的完成时间。

在我的例子中,完成单个任务的总时间没有改变;但很明显,我的计算机远未专用于 运行 一项任务 - 多任务调用以启动这些任务可以更多地利用现有资源,因此减少了完成时间。