【问题标题】:Bottleneck In TPL I Think我认为 TPL 的瓶颈
【发布时间】:2013-05-18 02:55:55
【问题描述】:

我正在开发一个小型 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# 中的答案很好。

【问题讨论】:

  • 您为什么要开始任务并立即等待它们?似乎违背了目的。

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


【解决方案1】:

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

很可能因为你要启动很多文件。您将受到 IO 限制 - 磁盘一次只能读取或写入一件事。通过一次给它200个文件来读取它,你让它更难真正完成它的工作。

我怀疑您可能会发现,如果您只在一个线程中执行所有 IO,您实际上会发现它更快。

此外,您应该使用性能监控来查看瓶颈所在。我强烈希望它是 IO - 但你应该检查一下。 (查看 CPU 使用率、磁盘使用率等)

【讨论】:

  • 感谢您的意见。这有所帮助,但仍有一些事情发生,但我做了更多的试验和错误,希望我能弄明白
【解决方案2】:

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

如果您正在处理大文件,则切换到顺序访问可能最终会更好。您应该使用 TPL 来并行 CPU-bound 任务。

【讨论】:

  • 感谢您的意见。我现在正在试错。 io 问题是个问题。多一点时间,我想我会解决我的逻辑错误
猜你喜欢
  • 2012-08-14
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多