一个例子看懂异步代码执行效率

异步代码采用线程池,提供代码执行的并行性,不阻塞当前线程,实例代码,模拟三个耗时操作,分别耗时为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();
        }
    }
时间: 2024-08-28 02:49:48

一个例子看懂异步代码执行效率的相关文章

一个例子看懂socket

一个服务端与多个客户端交互的例子 package j2se.socket; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /**  * Created by jingqing.zhou on 2015/6/17.  * 基于tcp协议的socket通信,实现用户登录  * 服务器端  */ public class server {     

一个例子看懂C语言中的++号的用法

话不多说,直接上代码: #include<stdio.h> int main(){ int suzu [10] ={10,11,12,13},i; int *p=suzu; //打印出所有的数据 for(i=0;i<10;i++) printf("%d\n",suzu[i]); //因为*的优先级高于+号 所以这个括号是必须要的 printf("\n"); //因为这个不是按照指针来读取的,所以我们会从默认第一位开始读取 for(i=0;i<

一个例子看懂神马是闭包

闭包就是这个玩意儿.怎么用在此不做多讲.就告诉大家闭包长神马样子. <!DOCTYPE html> <html> <head> <title>神马JS闭包</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script> function wenyi(){ var i=0; ret

用一个例子读懂 RequireJS

用一个例子读懂 RequireJS 例子来自官方,我稍微改造了一下,如下: // project.html <!DOCTYPE html> <html>     <head>         <title>requirejs</title>         <!-- data-main attribute tells require.js to load              scripts/main.js after require.

用VLD检测你的php代码执行效率~~

在写程序的时候,经常会为是改用empty()还是isset好,或是用单引号还是双引号来显示连接字符串而发出疑问,现在好了.我们其实可以通过程序很科学的得出精确的答案.知道我们的程序到底怎样写效率会更好. VLD全名是Vulcan Logic Disassembler,可以用来检测PHP脚本的执行情况. 1)安装VLD:wget http://pecl.php.net/get/vldtar zxvf vld-0.9.1.tgzcd vld-0.9.1phpize./configuremake in

用 console.time()和 console.timeEnd() 测试你的 javascript 代码执行效率

无意中学习到了一种测试 javascript 代码执行效率的一种方法,就记下来便于以后使用,用到了console对象中的  time  和  timeEnd  方法 . console.time('myFirstCode');  //开始(开始的名字要和结束的名字要一致哦) //你所要执行的 javascript程序 .... console.timeEnd('myFirstCode');    //结束 在浏览器控制台 console 这个按钮,查看代码执行时间 用 console.time(

ABAP怎样提高代码执行效率?

程序的设计思路当然会影响程序的执行速度.程序如何设计与程序员的个人习惯以及业务逻辑有很大的关系.下面我要谈的是如何提高程序中相关代码的执行效率.供参考. 1.杜绝使用 select ….endselect 语句.如果使用时 可以用 select …into cor.. table 替代 : 2.不要在 循环中 使用 select 语句,尽量使用 read table … BINARY SEARCH 替代: 3.select 中 尽量要求字段最少,避免 select * : 4.select 中如

一个例子读懂 JS 异步编程: Callback / Promise / Generator / Async

JS异步编程实践理解 回顾JS异步编程方法的发展,主要有以下几种方式: Callback Promise Generator Async 需求 显示购物车商品列表的页面,用户可以勾选想要删除商品(单选或多选),点击确认删除按钮后,将已勾选的商品清除购物车,页面显示剩余商品. 为了便于本文内容阐述,假设后端没有提供一个批量删除商品的接口,所以对用户选择的商品列表,需要逐个调用删除接口. 用一个定时器代表一次接口请求.那思路就是遍历存放用户已选择商品的id数组,逐个发起删除请求del,待全部删除完成

一篇文章看懂iOS代码块Block

iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD.动画.排序及各类回调 注: Block的声明与赋值只是保存了一段代码段,必须调用才能执行内部代码 Block变量的声明.赋值与调用 Block变量的声明 Block变量的声明格式为: 返回值类型(^Bl