关于多线程和多核处理器运行时关系的几点疑问?
本帖最后由 pengwei0417 于 2014-01-22 23:09:06 编辑 我用VB.NET2008写程序,以下代码的运行时间做了一下对比:
一、按钮单击事件中直接运行
Dim dt1 As Date = Now
For i As Integer = 0 To 9999
TextBox10.Text = i
Next
MsgBox((Now - dt1).TotalMilliseconds)
运行时间:506.289。
二、添加application.doevents
Dim dt1 As Date = Now
For i As Integer = 0 To 9999
Application.DoEvents()
TextBox10.Text = i
Next
MsgBox((Now - dt1).TotalMilliseconds)
运行时间:1814.0963。
三、用多线程运行
'测试多线程
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
BackgroundWorker1.WorkerReportsProgress = True
BackgroundWorker1.WorkerSupportsCancellation = True
BackgroundWorker1.RunWorkerAsync()
End Sub
'线程中过程
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim d1 As Date = Now
For i As Integer = 0 To 9999
Me.Invoke(New sw(AddressOf uuu), i)
Next
MsgBox((Now - d1).TotalMilliseconds)
BackgroundWorker1.CancelAsync()
End Sub
Private Delegate Sub sw(ByRef i As Integer)
Private Sub uuu(ByRef i As Integer)
TextBox10.Text = i.ToString
End Sub
运行时间:1480.254
我的CPU是I7 870四核八线程,为什么在开启另一个线程运行,性能下降的那么大,是不是CPU的多核多线程没起作用。
疑问一:vb.net2008开发多线程程序,是否只有CPU的一个核心工作。
疑问二:如休用vb.net2008开发CPU多核并行的程序是否有可能,是否有相关资料,英文的看不懂。
这方面的知识不太懂,请教。
[解决办法]
你的主动作
TextBox10.Text = i
是UI操作,不适合多线程测试。
[解决办法]
看任务管理器,如果CPU占用是13%,就是一个核在工作。
[解决办法]
没有什么绝对的关系。
让我们看看分时操作系统,假设同时有10终端挂在上面、有2000个线程在运行,那么这样的操作系统怎样才能让所有终端都显得不太卡?怎样才能各种处理(例如打印机打印的同时扫描仪也可以进行扫描,而绝对不是等待)显得并行?
多线程是CPU强大了之后、操作系统非常复杂了之后,操作系统上正在跑的应用进程太多了以后的必须。打个比方来说,假设一个城市的警察只管理1000个人,那么可以要求这些人干什么都排队、向上级汇报,这些人想同时干什么事情也得精密研究以顺序的思路去模拟并行流程。但是如果管理1000万人,那么就得用自由的方式,真正允许多线程。
[解决办法]
如果想用多个CPU并行工作,建议使用net 4.0中的System.Threading.Tasks命名空间中的数据并行和任务并行方式