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

我有一计算密集型程序段:for(inti=1;i<=100;i++){DoCalc(i);}AAA;BBB;......i从1至100要计算完需要很长时间,然后才能执行后... 我有一计算密集型程序段:
for(int i=1; i<=100; i++)
{
DoCalc(i);
}
AAA;
BBB;
......
i从1至100要计算完需要很长时间,然后才能执行后面的AAA,BBB语句。
可否采用多线程方式加快计算速度,代码应该怎样写?
DoCalc(i),计算和顺序无关,只要100个计算都分别处理完即可,而且,不涉及读写共同资源的问题。
展开
 我来答
曷凡
2009-05-22 · TA获得超过936个赞
知道小有建树答主
回答量:497
采纳率:0%
帮助的人:559万
展开全部
程序执行时间是和程序的周期有关的
线程是不能加快执行速度反而降低的
因为计算机在开启多个线程的同时需要对线程进行管理和切换

如果你非要加快执行速度
那么 不要使用 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)->接收回复->处理->发送信息...
注意,等待并不耗费CPU,我们需要等待100*a的时间

但是如果使用线程的话,100个线程同步进行:
发送信息->等待(a)->接收回复->处理
发送信息->等待(a)->接收回复->处理
发送信息->等待(a)->接收回复->处理
发送信息->等待(a)->接收回复->处理
....
这样等待时间就是 a
能减少程序执行时间,但是不减少CPU执行时间

-------------
但是由于你的程序不需要任何等待,这样,CPU一直是执行的
所以,程序执行时间基本等于CPU时间
百度网友6eed2f8
2009-05-21 · TA获得超过5082个赞
知道大有可为答主
回答量:3423
采纳率:0%
帮助的人:3776万
展开全部
呵呵,你的计算顺序跟i有关,所以没有更好的方法
用多线程的话,反而会增加程序运算量。
因为会产生额外的判读,加锁解锁等操作。

//补充
你的DoCalc里面是什么操作
如果都是基本的简单运算,那就别用多线程了
如果有比较复杂的运算,比如涉及到IO,DB,Socket的话可以用多线程,因为这一类的操作时间不由你程序控制,但是简单的运算的话就算了,那些运行时间是固定的,即使多线程也不会比这个快
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
FantasyChump
2009-05-21 · TA获得超过3287个赞
知道大有可为答主
回答量:2127
采纳率:0%
帮助的人:2221万
展开全部
多线程不是用来加快速度的,而是用做其它用途的。
多线程本身不能加快速度,除非你针对多核CPU进行了特殊优化。因为不管怎么分线程,最终你的计算量都是一样的,而多线程的操作中间会带来线程间通信的开销,所以速度不会快只可能降低(除非针对多核CPU进行了特殊优化可以使用所有的核心)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
darnis
2009-05-21 · 超过52用户采纳过TA的回答
知道小有建树答主
回答量:108
采纳率:0%
帮助的人:108万
展开全部
楼上 说得很对,多线程 并不定能提高你的 计算速度,
如果你的 计算机是 单 核 或者单CPU ,你 多线程 来做这个
工作,反而会 适得其反(操作系统在 多个线程之间调度,切换时还要 浪费时间周期的)

如果你的 计算机 是多核 或者多CPU 的,
那你可以参考一下 关于多核编程 方面的 知识,
这种情况下,你的计算 时间基本跟你的 核心 数量 是成比例 减少的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
箫韶九成凤凰来仪7
2015-08-12 · TA获得超过378个赞
知道小有建树答主
回答量:394
采纳率:0%
帮助的人:332万
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式