zoukankan      html  css  js  c++  java
  • 单线程与多线程执行效率

    问题:
      1个线程和100个线程同时执行一件事情,那个耗时最短?



    下边是代码:
     

     1 using System; 
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading;
     6 
     7 namespace _2012_05_08 
     8 {
     9     class Program
    10     {
    11         delegate void doRun();
    12         static void Main(string[] args)
    13         {
    14             Console.Write("清输入一个数字:");
    15             long Num = long.Parse(Console.ReadLine().Trim());
    16             //while (!Int32.TryParse(Console.ReadLine().Trim(), out Num)) { }
    17             OneThread(Num);
    18             
    19             while (true)
    20             {
    21         Console.WriteLine("稍事休息...");//此处是为了让CPU空闲一会儿
    22                 Thread.Sleep(2000);
    23                 Console.WriteLine("休息完毕继续>>···");
    24                 Console.Write("您希望开几个线程来执行此方法:");
    25                 OneHundredThreads(Num, Int32.Parse(Console.ReadLine().Trim()));
    26             }
    27         }
    28         static void OneThread(long Num)
    29         {
    30             int iBeginS = DateTime.Now.Second;
    31             int iBeginMS = DateTime.Now.Millisecond;
    32             
    33             max = Num;
    34             Method();
    35 
    36             int iEndS = DateTime.Now.Second;
    37             int iEndMS = DateTime.Now.Millisecond;
    38             int temp = (iEndS - iBeginS) * 1000 + iEndMS - iBeginMS;
    39             //这里的计时方法同下边方法的计时方法相同,只是粗略的方法,难免会出现 (负耗时) 的情况,
    40             //只需重新执行就行了。
    41             int iCountS = temp / 1000;
    42             int iCountMS = temp % 1000;
    43             Console.WriteLine("OneThread方法执行完毕,用时 {0} 秒 {1} 毫秒", iCountS, iCountMS);
    44         }
    45         static void OneHundredThreads(long Num,int HowMuch)
    46         {
    47             int iBeginS = DateTime.Now.Second;
    48             int iBeginMS = DateTime.Now.Millisecond;
    49 
    50             max = Num;
    51             Thread[] Ts = new Thread[HowMuch];
    52             for (int i = 0; i < Ts.Length; i++)
    53             {
    54                 //if (max <= 0) break;  //这一段代码页是比较耗时的,但是在线程数过大的时候还是挺高效的
    55                 Ts[i] = new Thread(Method);
    56                 Ts[i].Start();
    57             }
    58 
    59             int iEndS = DateTime.Now.Second;
    60             int iEndMS = DateTime.Now.Millisecond;
    61             int temp = (iEndS - iBeginS) * 1000 + iEndMS - iBeginMS;
    62             int iCountS = temp / 1000;
    63             int iCountMS = temp % 1000;
    64             Console.WriteLine("OneHundredThreads方法执行完毕,用时 {0} 秒 {1} 毫秒", iCountS, iCountMS);
    65         }
    66 
    67         //这里是线程要执行的方法,给定一个数,累减到0
    68         private static long max { set; get; }
    69         static void Method()
    70         {
    71             while (true)
    72             {
    73                 if (max <= 0) break;
    74                 max--;
    75             }
    76         }
    77     }
    78 }

     


                //总结:
                //    ①决定执行效率的不仅包含线程要执行的方法的复杂度,还有多开线程的线程数。
                //    ②尽量少的线程,来执行比较复杂的方法,要比单开线程执行要高效。
                //    ③简单的方法还是用单线程来执行比较合理。
                //    ④找到一种高效的线程执行方法需要经验和不断的调试。

                //回到思考题的答案上,不管执行的方法是否复杂 (单线程执行) 总要比 (开100个线程执行) 要可行的多。

     

    [菜鸟学习笔记,老鸟勿喷]

  • 相关阅读:
    软件设计师-成绩查询
    spring data jpa
    Maven 项目中使用 logback
    spring boot 整合 Camunda
    Spring 中 bean 的生命周期?
    如何合理的使用工具提高效率?
    Java 中的日志
    HashMap 原理?jdk1.7 与 1.8区别
    内存泄漏与溢出
    v-on 绑定自定义事件
  • 原文地址:https://www.cnblogs.com/TPoint/p/2683121.html
Copyright © 2011-2022 走看看