C#中如何用多线程加快计算速度?

来源:百度知道 编辑:UC知道 时间:2024/06/06 18:07:09
我有一计算密集型程序段:
for(int i=1; i<=100; i++)
{
DoCalc(i);
}
AAA;
BBB;
......
i从1至100要计算完需要很长时间,然后才能执行后面的AAA,BBB语句。
可否采用多线程方式加快计算速度,代码应该怎样写?
DoCalc(i),计算和顺序无关,只要100个计算都分别处理完即可,而且,不涉及读写共同资源的问题。

程序执行时间是和程序的周期有关的
线程是不能加快执行速度反而降低的
因为计算机在开启多个线程的同时需要对线程进行管理和切换

如果你非要加快执行速度
那么 不要使用 DoCalc(i)
在for语句中调用函数会每次都新建函数里面的变量
把DoCalc(i)的语句都直接写到for里,而变量写在for之外。
这样减少程序执行不必要的代码行,及时释放资源,减少对CPU时间的消耗

或者采用如下方法:
操作系统会为每个程序分配时间片
你可以打开任务管理器,查看->选择列->CPU时间 可以看到每个程序拥有的时间
同时这些时间又会更细的分配给线程

由此看来,你的程序拥有的时间是一定的
CPU只会分配这么多时间给你

如果你要通过操作系统来提高处理速度,那么,提高程序的优先级
因为程序拥有的时间片是间断的,如果提高优先级
那么他拥有的时间片可能会变成连续,这样,速度会显著提高

System.Diagnostics.Process p = ...;
p.PriorityClass = System.Diagnostics.ProcessPriorityClass.BelowNormal;
// 注意,这里是设置为低于标准

在C#里应该有直接提高自己进程优先级的 我以前做过
我这里使用的是windows 的API

---------------------------------------------
补充一点:
线程在有些时候可以提高减少程序执行的时间(不是CPU时间)
比如在等待某些资源的时候
我相信你肯定知道,线程之间资源是共享的

这样的话,我们对100个IP进行发送信息探测
如果顺序执行,那么CPU会执行如下顺序:
发送信息->等待(a)->接收回复->处理->发送信息...
注意,等待并不