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

时间:2011-12-21 14:12:40

标签: c#

众所周知,在软件开发中,我们可以被问到非常雄心勃勃的事情与技术有关。

最近我被问到将4000个文档从word转换为pdf的最快方法。进行转换的代码/软件就位,它在专用服务器上运行,因此硬件也在那里(这是一个重复的任务)。但从C#性能的角度来看,最好的方法是什么?

我一直在思考将这些分解成块(即40个文档)并转换它们(即40个独特的文档x 1000个parellel任务),它们同时运行。这是正确的想法,表现明智吗?最简单(也是最长的)是一个贯穿每个文档的串行循环。

你会推荐什么?没有语言限制,所以C#4.0,LINQ等都可用。

2 个答案:

答案 0 :(得分:2)

取三份文件并按顺序处理。取平均时间并乘以文档总数。如果那个时间合理,则停止编码并发布到服务器。 您刚刚以您的开发速度节省了公司开发成本,因为节省的时间实际上可能比节省30分钟的服务器运行节省成本,这使您在几周的时间内完成了编码。< / em>的

否则开始研究.Net四并行编程并对30个文档进行测试,并进行与上述相似的计算,看其是否合理。如果那个时间合理,则停止编码并发布到服务器。

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

HTH

答案 1 :(得分:2)

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

可能最好的方法是使用简单的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和任务做同样的事情:

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

在任何一种情况下,您都可以让运行时库找出要并行执行的任务数。