0

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

4

2 回答 2

3

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

很可能是因为您正在启动大量文件。您将受到 IO 限制 - 磁盘一次只能读取或写入一件事。通过一次读取 200 个文件,您将使其实际工作变得更加困难。

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

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

于 2013-05-17T15:57:21.567 回答
0

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

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

于 2013-05-17T18:55:55.893 回答