首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-10-11 
一个关于多线程和for循环的问题不知道是不是我多线程的问题,今天测试了一下,发现多线程可以并行处理完数据

一个关于多线程和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);
        }
    }


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

热点排行