运行CPU/内存密集型任务-哪种编码方法性能最高

本文关键字:编码方法 性能 CPU 内存 密集型 任务 运行 | 更新日期: 2023-09-27 18:18:25

我们都知道,在软件开发中,我们可能会被要求做一些非常雄心勃勃的事情。

最近有人问我如何最快地将4000个文档从word转换为pdf。进行转换的代码/软件已经到位,并且运行在专用服务器上,因此硬件也在那里(这是一个反复出现的任务)。但是从c#性能的角度来看,什么是最好的方法呢?

我一直在考虑将其分解成块(即40个文档)并转换它们(即40个唯一文档x 1000个并行任务),它们同时运行。在性能方面,这是正确的想法吗?最简单(也是最长)的是遍历每个文档的串行循环。

你有什么建议吗?没有语言限制,所以c# 4.0, LINQ等都可以使用。

运行CPU/内存密集型任务-哪种编码方法性能最高

1000个并行任务?您想并发运行1000个线程?您将花费更多的时间在线程切换上,而不是实际工作上。如果您有一个四核机器,您应该运行四个线程,每个线程一次转换一个文档。

可能最好的开始方式是使用一个简单的Parallel.ForEach,让运行时库来调度任务。比如:

List<string> DocumentsToConvert = new List<string>();
// here, load the file names of all the documents you want to convert.
// Then, process them with:
Parallel.Foreach(DocumentsToConvert, (doc) => { ConvertDocument(doc); });

你可以用TPL和tasks做同样的事情:

foreach (var doc in DocumentsToConvert)
{
    // Create and start a task to convert that document
}

无论哪种情况,您都可以让运行库计算并行执行多少任务。

取三个文档并按顺序处理它们。将平均时间乘以文档总数。如果时间合理,请停止编码并将其发布到服务器。你只是以你的开发速度节省了公司的开发成本,因为节省的时间实际上可能比在服务器运行中节省30分钟的成本更大,而这花费了你一周的编码时间。

否则,开始研究。net 4的并行编程,在30个文档上进行测试,并进行类似的计算,看看是否合理。如果时间合理,请停止编码并将其发布到服务器。

如果这个时间不合理,那么讨论使用更多的服务器来进一步分割工作。

HTH