VB.NET:启动大量线程需要很长时间?

时间:2011-02-14 05:25:10

标签: .net multithreading performance threadpool

我正在尝试编写多线程应用程序。

请考虑以下代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim sw As New Stopwatch
    Dim sw2 As New Stopwatch

    sw.Start()

    For x As Integer = 0 To 150
        Dim th As Thread = New Thread(New ThreadStart(AddressOf work))
        th.Start()

    Next

    sw.Stop()


    MsgBox(sw.Elapsed.ToString())

End Sub

Private Sub work()
End Sub

如果按下表单上的按钮,则会循环启动150个线程。他们的工作子实际上没有做任何事情......这只是一个开始很多线程的练习。

我在16核机器上运行它,需要将近半秒才能完成。考虑到当在我的应用程序中实现此代码时,在单个线程上运行工作子(当它实际上包含有用的例程时)比使用所有16​​个核心时需要更短的时间,这是非常令人发指的。

为什么启动线程需要这么长时间?一旦取出“th.start()”行,代码就会在半毫秒内执行。

是否有更快的方式来启动线程?我应该使用线程池系统吗?看起来像多线程是没有意义的,因为它实际上可以导致比单线程慢得多的速度......因为简单地启动所有线程可能需要很长时间。

1 个答案:

答案 0 :(得分:1)

运行150个线程几乎总是一个坏主意。调度员会讨厌你,让你的生活因为思考这种疯狂而悲惨。

如果你想要真正的高性能代码,你应该运行大约与内核相同数量的线程,并且每个内部异步(对于I / O负载很重)或顺序执行(对于CPU负载很重)线程。

通过其中一个标准线程池运行任务是一个非常好的折衷方案。