我认为TPL存在瓶颈

时间:2013-05-17 15:54:34

标签: .net vb.net task-parallel-library

我正在开发一个小型winforms应用程序,根据文件内容移动\格式化一些文件。我制作了相同文件的几百份副本,看看处理文件需要多长时间。如果我只迭代10到20个文件,它每秒处理22000 kb,但当我迭代超过150到200个文件时,每秒kb下降到11,000。当然,更多的文件需要更长的时间,但为什么每秒的kb会下降这么多呢?文件是一样的,所以发生了什么?这是代码的骨架......

       'classA
       For Each f As String In files
            Dim p As New Item(f)
            AddHandler p.InitCompleted, AddressOf DoWork

            Task.Factory.StartNew(Sub()
                                      p.StartInit()
                                  End Sub).Wait() 

        Next f

        'classA - - _scheduler declared at the class level and assigned FromCurrentSynchronizationContext
        Public Sub DoWork()
           'move/format files
            Task.Factory.StartNew(Sub() RaiseEvent AnEvent(intVal1, intVal2), Nothing, Threading.Tasks.TaskCreationOptions.None, _scheduler).Wait()

        End Sub

        'classItem 
          Private Sub Init() 
               'search file contents
                Task.Factory.StartNew(Sub()  RaiseEvent InitCompleted(), Nothing, Threading.Tasks.TaskCreationOptions.None, _scheduler).Wait()
          End Sub

          'gui winform
           AddHandler classa.AnEvent, AddressOf OnAnEvent

           Private Sub OnAnEvent(ByVal param1 Integer, ByVal param2 As Integer)
                txtBox1.Text = param1
                txtBox2.Text = Param2
           End Sub

任何输入都将不胜感激。 c#中的答案很好。

2 个答案:

答案 0 :(得分:3)

  

当然,更多的文件需要更长的时间,但为什么每秒的kb会下降太多?

很可能因为你正在启动大量文件。您将受IO限制 - 磁盘一次只能读取或写入一个东西。通过给它提供200个文件来同时阅读 ,你会让它更难以实际完成它的工作。

我怀疑你可能会发现如果你只是在一个线程中所有 IO,你会发现它更快。

此外,您应该使用性能监视来查看瓶颈所在。我强烈期望它是IO - 但你应该检查。 (查看CPU使用情况,磁盘使用情况等)

答案 1 :(得分:0)

Windows附带的资源监视器可以用来查找应用程序中有10-20个文件的瓶颈,然后并行处理150-200个文件。正如@JonSkeet所提到的,你很可能是IO限制的。实际上,甚至10个并行文件对于硬盘来说太多了,但是SSD可能会在这里表现出更好的性能。

如果您正在使用大文件,切换到顺序访问可能会更好地整体。您应该使用TPL来并行 CPU绑定的任务。

相关问题