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

2024-11-15 19:59:55
推荐回答(5个)
回答1:

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

如果你非要加快执行速度
那么 不要使用 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时间

回答2:

呵呵,你的计算顺序跟i有关,所以没有更好的方法
用多线程的话,反而会增加程序运算量。
因为会产生额外的判读,加锁解锁等操作。

//补充
你的DoCalc里面是什么操作
如果都是基本的简单运算,那就别用多线程了
如果有比较复杂的运算,比如涉及到IO,DB,Socket的话可以用多线程,因为这一类的操作时间不由你程序控制,但是简单的运算的话就算了,那些运行时间是固定的,即使多线程也不会比这个快

回答3:

多线程不是用来加快速度的,而是用做其它用途的。
多线程本身不能加快速度,除非你针对多核CPU进行了特殊优化。因为不管怎么分线程,最终你的计算量都是一样的,而多线程的操作中间会带来线程间通信的开销,所以速度不会快只可能降低(除非针对多核CPU进行了特殊优化可以使用所有的核心)。

回答4:

楼上 说得很对,多线程 并不定能提高你的 计算速度,
如果你的 计算机是 单 核 或者单CPU ,你 多线程 来做这个
工作,反而会 适得其反(操作系统在 多个线程之间调度,切换时还要 浪费时间周期的)

如果你的 计算机 是多核 或者多CPU 的,
那你可以参考一下 关于多核编程 方面的 知识,
这种情况下,你的计算 时间基本跟你的 核心 数量 是成比例 减少的。

回答5:

多线程不会加快计算速度

看这儿:

http://zhidao.baidu.com/link?url=lVDWh9tMi-PlvHBHRQ8Nn8hTTWcKqET_m6kRFm2x39zmfQE5CBKZJJIQo4J4otatEPtjFOX97uRElxpCP351f_