在 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() 从根本上减少了总的完成时间。
在我的例子中,完成单个任务的总时间没有改变;但很明显,我的计算机远未专用于 运行 一项任务 - 多任务调用以启动这些任务可以更多地利用现有资源,因此减少了完成时间。
我的代码(用 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() 从根本上减少了总的完成时间。
在我的例子中,完成单个任务的总时间没有改变;但很明显,我的计算机远未专用于 运行 一项任务 - 多任务调用以启动这些任务可以更多地利用现有资源,因此减少了完成时间。