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个计算都分别处理完即可,而且,不涉及读写共同资源的问题。 展开
for(int i=1; i<=100; i++)
{
DoCalc(i);
}
AAA;
BBB;
......
i从1至100要计算完需要很长时间,然后才能执行后面的AAA,BBB语句。
可否采用多线程方式加快计算速度,代码应该怎样写?
DoCalc(i),计算和顺序无关,只要100个计算都分别处理完即可,而且,不涉及读写共同资源的问题。 展开
8个回答
展开全部
程序执行时间是和程序的周期有关的
线程是不能加快执行速度反而降低的
因为计算机在开启多个线程的同时需要对线程进行管理和切换
如果你非要加快执行速度
那么 不要使用 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时间
线程是不能加快执行速度反而降低的
因为计算机在开启多个线程的同时需要对线程进行管理和切换
如果你非要加快执行速度
那么 不要使用 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时间
展开全部
呵呵,你的计算顺序跟i有关,所以没有更好的方法
用多线程的话,反而会增加程序运算量。
因为会产生额外的判读,加锁解锁等操作。
//补充
你的DoCalc里面是什么操作
如果都是基本的简单运算,那就别用多线程了
如果有比较复杂的运算,比如涉及到IO,DB,Socket的话可以用多线程,因为这一类的操作时间不由你程序控制,但是简单的运算的话就算了,那些运行时间是固定的,即使多线程也不会比这个快
用多线程的话,反而会增加程序运算量。
因为会产生额外的判读,加锁解锁等操作。
//补充
你的DoCalc里面是什么操作
如果都是基本的简单运算,那就别用多线程了
如果有比较复杂的运算,比如涉及到IO,DB,Socket的话可以用多线程,因为这一类的操作时间不由你程序控制,但是简单的运算的话就算了,那些运行时间是固定的,即使多线程也不会比这个快
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多线程不是用来加快速度的,而是用做其它用途的。
多线程本身不能加快速度,除非你针对多核CPU进行了特殊优化。因为不管怎么分线程,最终你的计算量都是一样的,而多线程的操作中间会带来线程间通信的开销,所以速度不会快只可能降低(除非针对多核CPU进行了特殊优化可以使用所有的核心)。
多线程本身不能加快速度,除非你针对多核CPU进行了特殊优化。因为不管怎么分线程,最终你的计算量都是一样的,而多线程的操作中间会带来线程间通信的开销,所以速度不会快只可能降低(除非针对多核CPU进行了特殊优化可以使用所有的核心)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上 说得很对,多线程 并不定能提高你的 计算速度,
如果你的 计算机是 单 核 或者单CPU ,你 多线程 来做这个
工作,反而会 适得其反(操作系统在 多个线程之间调度,切换时还要 浪费时间周期的)
如果你的 计算机 是多核 或者多CPU 的,
那你可以参考一下 关于多核编程 方面的 知识,
这种情况下,你的计算 时间基本跟你的 核心 数量 是成比例 减少的。
如果你的 计算机是 单 核 或者单CPU ,你 多线程 来做这个
工作,反而会 适得其反(操作系统在 多个线程之间调度,切换时还要 浪费时间周期的)
如果你的 计算机 是多核 或者多CPU 的,
那你可以参考一下 关于多核编程 方面的 知识,
这种情况下,你的计算 时间基本跟你的 核心 数量 是成比例 减少的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询