【问题标题】:What is the fastest way to run an exe command many times in C#?在 C# 中多次运行 exe 命令的最快方法是什么?
【发布时间】:2015-10-02 04:42:00
【问题描述】:

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

目前我在 C# 中将 exe 命令作为 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 进程。

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

【问题讨论】:

  • .exe 有什么作用?
  • 这是latex 命令,将乳胶方程转换为图像。程序应该找到文档中的所有方程式并将其转换为图像。
  • 不,将其嵌入您的程序集中不会使其执行得更快。
  • 应该没有什么可以阻止您并行运行 4 或 5 个这些进程,尝试一次启动多个(不是 800 个,而是其中一些)。

标签: c# command-line process exe


【解决方案1】:

可能是同时运行它们会迫使它们竞争资源,例如 - 用完所有系统内存,导致分页到 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(); });

【讨论】:

    【解决方案2】:

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

    就我而言,完成单个任务的总时间没有改变;但很明显,我的计算机远未专门用于运行该一项任务 - 多任务调用以启动这些任务会更多地利用现有资源,因此缩短了完成时间。

    【讨论】:

      【解决方案3】:

      我不知道在 C# 中运行的进程在低级别是如何工作的,但我不得不想象它不是很有效率。你应该研究一些关于如何运行你的 exe 的抽象,特别是你运行它的数量。想到的最明显的一个是使用线程。

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

      有很多资源可以在线程内运行代码,看看周围并尝试将其作为加快代码速度的替代方法。

      【讨论】:

      • 在线程内运行 Process 不会带来任何好处(至少使用 .Start(),如果使用 .WaitForExit() 则不同),它会在 C# 可执行文件之外启动一个完全不同的进程过程。 Process 类只是一个用于启动其他可执行文件的轻量级容器。
      • 是的,但是与进程的开始和结束相关的操作系统开销仍然相当可观。 @Ali 可以做的是启动多个进程,并控制它们的执行不会在任务完成后立即被终止,而是继续执行下一个进程。就像你上面说的,同时运行多个。
      猜你喜欢
      • 1970-01-01
      • 2021-10-17
      • 2010-10-06
      • 2021-08-03
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      相关资源
      最近更新 更多