zoukankan      html  css  js  c++  java
  • 一个例子看懂异步代码执行效率

    异步代码采用线程池,提供代码执行的并行性,不阻塞当前线程,实例代码,模拟三个耗时操作,分别耗时为1000、1500、1800ms,提供同步与异步的实现方式,Main中以同步异步的方式执行,对比执行时间,同步执行方式为各个方法的执行时间总和,而异步执行方式为最长的那个时间。ps:实际执行情况可能有其他的一些微不足道开销,但大体能反应异步的执行效率。

      class OutHelper
        {
            public DateTime Method1()
            {
                Thread.Sleep(1000);
                return DateTime.Now;
            }
    
            public DateTime Method2()
            {
                Thread.Sleep(1500);
                return DateTime.Now;
            }
    
            public DateTime Method3()
            {
                Thread.Sleep(1800);
                return DateTime.Now;
            }
    
            public async Task<DateTime> AMethod1()
            {
                await Task.Delay(1000);
                return DateTime.Now;
            }
    
            public async Task<DateTime> AMethod2()
            {
                await Task.Delay(1500);
                return DateTime.Now;
            }
    
            public async Task<DateTime> AMethod3()
            {
                await Task.Delay(1800);
                return DateTime.Now;
            }
        }
    class Program
        {
            static void Main(string[] args)
            {
                OutHelper oh = new OutHelper();
    
                Console.WriteLine("同步调用开始……");
                Stopwatch sw = new Stopwatch();
                sw.Start();
    
                DateTime d1 = oh.Method1();
                DateTime d2 = oh.Method2();
                DateTime d3 = oh.Method3();
                Console.WriteLine("同步:d1={0}, d2={1}, d3={2}", d1, d2, d3);
                Console.Out.Flush();
                sw.Stop();
                Console.WriteLine("同步调用耗时:{0}", sw.ElapsedMilliseconds);
    
    
                Console.WriteLine("异步调用开始……");
    
                sw.Reset();
                sw.Start();
    
                var ad1 = oh.AMethod1();
                var ad2 = oh.AMethod2();
                var ad3 = oh.AMethod3();
    
               Task.WhenAll(ad1, ad2, ad3);
                Console.WriteLine("同步:d1={0}, d2={1}, d3={2}", ad1.Result, ad2.Result, ad3.Result);
                Console.Out.Flush();
                sw.Stop();
    
                Console.WriteLine("异步调用耗时:{0}", sw.ElapsedMilliseconds);
    
                Console.ReadLine();
            }
        }

    另外一种并行执行的方式:

     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Stopwatch sw = new Stopwatch();
     6             sw.Start();
     7             Parallel.Invoke(Fun1, Fun2);
     8             sw.Stop();
     9             Console.WriteLine("cost2:{0}", sw.ElapsedMilliseconds);
    10 
    11             sw.Reset();
    12             sw.Start();
    13             Fun1();
    14             Fun2();
    15             sw.Stop();
    16 
    17             Console.WriteLine("cost2:{0}", sw.ElapsedMilliseconds);
    18 
    19         }
    20 
    21 
    22 
    23 
    24         static void Fun1()
    25         {
    26             Thread.Sleep(1000);
    27             Console.WriteLine("Fun1");
    28         }
    29 
    30         static void Fun2()
    31         {
    32             Thread.Sleep(1500);
    33             Console.WriteLine("Fun2");
    34         }
    35     }
    使用 Parallel.Invoke方式实现
  • 相关阅读:
    软件测试进程&测试类型
    课堂笔记:软件测试知识点汇总小结
    闰年测试程序
    关于 int.parse("abcd") 出错的问题分析及解决方案
    软件测试——字符串检测2.0
    边界值分析法实例分析
    测试管理
    软件评审
    单元测试与集成测试
    白盒测试
  • 原文地址:https://www.cnblogs.com/weiweictgu/p/5558411.html
Copyright © 2011-2022 走看看