0

我简化了我的程序,因此我基本上加载了一个文件,并将文件中的值添加到列表中。提高嵌套循环的性能

IList<string> MyList = new List<string>(); 

Main() 
{ 
    foreach(Row r in InputFile) 
    { 
     foreach(Cell c in r) 
     { 
      AddToList(c.Value); 
     } 
    } 
} 

public void AddToTheList(string value) 
{ 
    MyList.Add(value); 
} 

我期待加快循环的处理,我不关心值的添加顺序。

我在考虑并行运行循环和/或将AddToTheList方法视为异步火灾并忘记。

使代码使用服务器处理能力并加快处理文件总时间的最简单方法是什么?

+0

“使用服务器”是什么意思? – rhughes

+1

这个问题似乎是无关紧要的,因为它需要性能代码审查 - checkout codereview.stackexchange.com –

+0

“InputFile”的类型是什么? – rhughes

回答

4

更新:如果内部循环足够大以使该任务受CPU限制(而不是IO限制),那么可以使用Parallel.ForEach对循环进行分区。这里有一个例子:

Parallel.ForEach(InputFile, row => 
{ 
    foreach(Cell c in row) 
     AddToList(c.Value); 
}); 

或者,改变AddToList签名返回所需的值,并用PLINQ代替。

MyList = InputFile.AsParallel() 
        .SelectMany(row => row.AsParallel() 
             .Select(cell => TransformCell(cell.Value)) 
        .ToList(); 

public string TransformCell(string value) 
{ 
    return value + " something"; 
} 

制作AddToTheList一个发射后不管异步方法是几乎可以肯定不是一个好的选择。由该方法引发的异常将不受处理,并且取决于您使用的是哪个框架,这些可能会使应用程序崩溃。


将调用并行化到AddToTheList是不好的 - 这个任务是IO绑定的。 瓶颈在于您可以从磁盘读取数据的速度有多快。

并行磁盘访问也不行。有两个或更多线程读取相同的文件将不会更快 - 他们将不得不轮流。看到这个答案Is it possible to use threads to speed up file reading?

使用尽可能多的线程,因为你有文件。

1

这取决于。如果解析行和单元格并向列表中添加值很简单,那么并行处理并不会对您有所帮助 - 您将受到I/O限制,这比CPU慢很多。但是,如果解析行需要时间,并且您没有真正添加到List,而是执行更复杂的操作,则可以从文件中读取行,然后并行处理行 - 只需预先分配内存为他们(List让你这样做)并行访问每行的List位置。