我正在尝试编写多线程应用程序。
请考虑以下代码:
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()”行,代码就会在半毫秒内执行。
是否有更快的方式来启动线程?我应该使用线程池系统吗?看起来像多线程是没有意义的,因为它实际上可以导致比单线程慢得多的速度......因为简单地启动所有线程可能需要很长时间。
答案 0 :(得分:1)
运行150个线程几乎总是一个坏主意。调度员会讨厌你,让你的生活因为思考这种疯狂而悲惨。
如果你想要真正的高性能代码,你应该运行大约与内核相同数量的线程,并且每个内部异步(对于I / O负载很重)或顺序执行(对于CPU负载很重)线程。
通过其中一个标准线程池运行任务是一个非常好的折衷方案。