一个例子看懂异步代码执行效率
Posted 漂泊雪狼的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个例子看懂异步代码执行效率相关的知识,希望对你有一定的参考价值。
异步代码采用线程池,提供代码执行的并行性,不阻塞当前线程,实例代码,模拟三个耗时操作,分别耗时为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 }
以上是关于一个例子看懂异步代码执行效率的主要内容,如果未能解决你的问题,请参考以下文章