读书人

一个关于多线程和for循环的有关问题

发布时间: 2013-10-11 14:52:39 作者: rapoo

一个关于多线程和for循环的问题
不知道是不是我多线程的问题,今天测试了一下,发现多线程可以并行处理完数据,可是消耗的时间却比for还长!

FOR循环代码如下:


for (int i = 0; i < 7; i++)
{

Doit(mm);
}

public static void Doit(object Dom)
{
Console.WriteLine("A"+DateTime.Now);
string ml = "";
for (int i = 0; i < 10000; i++)
{
ml += DateTime.Now.ToString();
//Console.WriteLine(DateTime.Now);
}
Console.WriteLine(DateTime.Now);
}


多线程如下:


Thread[] ths = new Thread[12];//创建线程集合体
ParameterizedThreadStart[] pst = new ParameterizedThreadStart[12];//创建带参数的线程委托
for (int m = 0; m < 7; m++)
{
int f = m + 10;

pst[m] = new ParameterizedThreadStart(Doit);//将函数作为参数传递到线程委托中
ths[m] = new Thread(pst[m]);//实例化线程
object o = "A";//将对象封装成Object
ths[m].Start(o);//传参数启动线程
}



public static void Doit(object Dom)
{
Console.WriteLine("A"+DateTime.Now);
string ml = "";
for (int i = 0; i < 10000; i++)
{
ml += DateTime.Now.ToString();
//Console.WriteLine(DateTime.Now);
}
Console.WriteLine(DateTime.Now);
}





不知道是写错了还是怎么的,测试多次都是for胜出!!求大牛解答。。。。
[解决办法]
无论怎么,pc机同一时候只能执行同一件事,执行完你的循环花的时间是一样的,你用多线程还增加了额外的操作。
多线程其实就是解决有些延时操作,让他不阻碍主线程。。。


如果是多核cpu 在Visual Studio 2010上实现多核编程的话就可以用多线程减少执行时间。
[解决办法]
引用:
无论怎么,pc机同一时候只能执行同一件事,执行完你的循环花的时间是一样的,你用多线程还增加了额外的操作。
多线程其实就是解决有些延时操作,让他不阻碍主线程。。。


如果是多核cpu 在Visual Studio 2010上实现多核编程的话就可以用多线程减少执行时间。


就是,多线程不一定能提高执行的速度,具体情况还要看你CPU的个(核)数和你的线程的个数。线程也是一种开销。楼主还要好好看看书。
[解决办法]
1.多线程不一定能提高执行的速度,需要考虑线程的创建消耗,以及同步数据的消耗(本例未涉及)
2.双核并不能简单的看成是单核的两倍(以前似乎看到个曲线图,如果没记错的话在理想状态下4核才刚能达到1核处理的2倍)
3.lz提到的“速度”只是限定在整个for处理,但是忽略了程序的“响应速度”。单线程的情况下只有所有处理完成,程序才能相应用户;多线程的情况下Thread.Start后立即返回,程序可以立即响应用户的后续处理。
4.以上的场景可以考虑采用Parallel.For

以上是个人理解,如有不正...悄悄告诉我吧~~
[解决办法]

class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();


sw.Start();
for (int i = 0; i < 7; i++)
{ Doit(); }
Console.WriteLine(sw.Elapsed);
sw.Restart();
Parallel.For(0, 7, i => Doit());
Console.WriteLine(sw.Elapsed);

Console.ReadKey();
}
static void Doit()
{
// Console.WriteLine("A" + DateTime.Now);
Int64 ml=0;
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j <100000; j++)

ml++;
//Console.WriteLine(DateTime.Now);
}
// Console.WriteLine(DateTime.Now);
}
}


由于垃圾回收是另外的特定线程调用,你的每次运算产生了过多的垃圾,你试试纯运算

读书人网 >C#

热点推荐