.net中关于异步性能测试的示例代码

很久没有写博客了,今年做的产品公司这两天刚刚开了发布会,稍微清闲下来,想想我们做的产品还有没有性能优化空间,于是想到了.net的异步可以优化性能,但到底能够提升多大的比例呢?恰好有一个朋友正在做各种语言的异步性能测试(有关异步和同步的问题,请参考客《aio与bio接口性能对比》),于是我今天写了一个c#的测试程序。

首先,建一个 ASP.NET MVC WebAPI项目,在默认的控制器 values里面,增加两个方法:

 // GET api/values?sleepTime=10         [HttpGet]         public async Task ExecuteAIO(int sleepTime)         {                    await Task.Delay(sleepTime);                    return  "Hello world,"+ sleepTime;        }        [HttpGet]                // GET api/values?sleepTime2=10        public string ExecuteBIO(int sleepTime2)        {            System.Threading.Thread.Sleep(sleepTime2);                        return "Hello world," + sleepTime2;        }

然后,建立一个控制台程序,来测试这个web API:

.net中关于异步性能测试的示例代码.net中关于异步性能测试的示例代码

 class Program    {        static void Main(string[] args)        {            Console.WriteLine("按任意键开始测试 WebAPI:http://localhost:62219/api/values?sleepTime={int}");            Console.Write("请输入线程数:");                        int threadNum = 100;                        int.TryParse(Console.ReadLine(), out threadNum);                        while (Test(threadNum)) ;            Console.ReadLine();            Console.ReadLine();        }        private static bool Test(int TaskNumber)        {            Console.Write("请输入此API方法的睡眠时间(毫秒),输入非数字内容退出:");                        string input = Console.ReadLine();                        int SleepTime = 50;                        if (!int.TryParse(input, out SleepTime))                            return false;            HttpClient client = new HttpClient();            client.BaseAddress = new Uri("http://localhost:62219/");                        var result = client.GetStringAsync("api/values?sleepTime=" + input).Result;            Console.WriteLine("Result:{0}", result);                        //int TaskNumber = 1000;            Console.WriteLine("{0}次 BIO(同步)测试(睡眠{1} 毫秒):", TaskNumber, SleepTime);            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();            sw.Start();            Task[] taskArr = new Task[TaskNumber];                        for (int i = 0; i < TaskNumber; i++)            {                Task task = client.GetStringAsync("api/values?sleepTime2=" + SleepTime);                taskArr[i] = task;            }            Task.WaitAll(taskArr);            sw.Stop();                        double useTime1 = sw.Elapsed.TotalSeconds;            Console.WriteLine("耗时(秒):{0},QPS:{1,10:f2}", useTime1, TaskNumber/useTime1);            sw.Reset();            Console.WriteLine("{0}次 AIO(异步)测试(睡眠{1} 毫秒):", TaskNumber, SleepTime);            sw.Start();                        for (int i = 0; i < TaskNumber; i++)            {                Task task = client.GetStringAsync("api/values?sleepTime=" + SleepTime);                taskArr[i] = task;            }            Task.WaitAll(taskArr);            sw.Stop();                        double useTime2 = sw.Elapsed.TotalSeconds;            Console.WriteLine("耗时(秒):{0},QPS:{1,10:f2}", useTime2, TaskNumber / useTime2);                        return true;        }    }

View Code

其实主要是下面几行代码:

HttpClient client = new HttpClient();client.BaseAddress = new Uri("http://localhost:62219/");var result = client.GetStringAsync("api/values?sleepTime=" + input).Result;

注意,你可能需要使用Nuget添加下面这个包:

Microsoft.AspNet.WebApi.Client

最后,运行这个测试,结果如下:

按任意键开始测试 WebAPI:http://localhost:62219/api/values?sleepTime={int}请输入线程数:1000请输入此API方法的睡眠时间(毫秒),输入非数字内容退出:10Result:"Hello world,10"1000次 BIO(同步)测试(睡眠10 毫秒):耗时(秒):1.2860545,QPS:    777.571000次 AIO(异步)测试(睡眠10 毫秒):耗时(秒):0.4895946,QPS:   2042.51请输入此API方法的睡眠时间(毫秒),输入非数字内容退出:100Result:"Hello world,100"1000次 BIO(同步)测试(睡眠100 毫秒):耗时(秒):8.2769307,QPS:    120.821000次 AIO(异步)测试(睡眠100 毫秒):耗时(秒):0.5435111,QPS:   1839.89

本来想尝试测试10000个线程,但报错了。

 

上面的测试结果,QPS并不高,但由于使用的是IISExpress,不同的Web服务器软件性能不相同,所以还得对比下进程内QPS结果,于是新建一个控制台程序,代码如下:

.net中关于异步性能测试的示例代码.net中关于异步性能测试的示例代码

 class Program    {        static void Main(string[] args)        {            Console.WriteLine("按任意键开始测试 ");            Console.Write("请输入线程数:");                        int threadNum = 100;                        int.TryParse(Console.ReadLine(), out threadNum);                        while (Test(threadNum)) ;            Console.ReadLine();            Console.ReadLine();        }        private static bool Test(int TaskNumber)        {            Console.Write("请输入此API方法的睡眠时间(毫秒),输入非数字内容退出:");                        string input = Console.ReadLine();                        int SleepTime = 50;                        if (!int.TryParse(input, out SleepTime))                            return false;                        var result = ExecuteAIO(SleepTime).Result;            Console.WriteLine("Result:{0}", result);                        //int TaskNumber = 1000;            Console.WriteLine("{0}次 BIO(同步)测试(睡眠{1} 毫秒):", TaskNumber, SleepTime);            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();            sw.Start();            Task[] taskArr = new Task[TaskNumber];                        for (int i = 0; i < TaskNumber; i++)            {                Task task = Task.Run(()=> ExecuteBIO(SleepTime));                taskArr[i] = task;            }            Task.WaitAll(taskArr);            sw.Stop();            double useTime1 = sw.Elapsed.TotalSeconds;            Console.WriteLine("耗时(秒):{0},QPS:{1,10:f2}", useTime1, TaskNumber / useTime1);            sw.Reset();            Console.WriteLine("{0}次 AIO(异步)测试(睡眠{1} 毫秒):", TaskNumber, SleepTime);            sw.Start();            for (int i = 0; i < TaskNumber; i++)            {                Task task = ExecuteAIO(SleepTime);                taskArr[i] = task;            }            Task.WaitAll(taskArr);            sw.Stop();            double useTime2 = sw.Elapsed.TotalSeconds;            Console.WriteLine("耗时(秒):{0},QPS:{1,10:f2}", useTime2, TaskNumber / useTime2);                        return true;        }        public static async Task ExecuteAIO(int sleepTime)        {            await Task.Delay(sleepTime);            return "Hello world," + sleepTime;        }        public static string ExecuteBIO(int sleepTime2)        {            System.Threading.Thread.Sleep(sleepTime2);                        //不能在非异步方法里面使用 Task.Delay,否则可能死锁                        //Task.Delay(sleepTime2).Wait();            return "Hello world," + sleepTime2;        }    }

View Code

注意,关键代码只有下面两个方法:

 public static async Task ExecuteAIO(int sleepTime)        {            await Task.Delay(sleepTime);                    return "Hello world," + sleepTime;        }        public static string ExecuteBIO(int sleepTime2)        {            System.Threading.Thread.Sleep(sleepTime2);                        //不能在非异步方法里面使用 Task.Delay,否则可能死锁                        //Task.Delay(sleepTime2).Wait();            return "Hello world," + sleepTime2;        }

这两个方法跟WebAPI的测试方法代码是一样的,但是调用代码稍微不同:

同步调用:

 Task[] taskArr = new Task[TaskNumber];            for (int i = 0; i < TaskNumber; i++)            {                Task task = Task.Run(()=> ExecuteBIO(SleepTime));                taskArr[i] = task;            }            Task.WaitAll(taskArr);

异步调用:

 for (int i = 0; i < TaskNumber; i++)            {                Task task = ExecuteAIO(SleepTime);                taskArr[i] = task;            }            Task.WaitAll(taskArr);

可见,这里测试的时候,同步和异步调用,客户端代码都是使用的多线程,主要的区别就是异步方法使用了 async/await 语句。

下面是非Web的进程内异步多线程和同步多线程的结果:

请输入线程数:1000请输入此API方法的睡眠时间(毫秒),输入非数字内容退出:10Result:Hello world,101000次 BIO(同步)测试(睡眠10 毫秒):耗时(秒):1.3031966,QPS:    767.341000次 AIO(异步)测试(睡眠10 毫秒):耗时(秒):0.026441,QPS:  37820.05请输入此API方法的睡眠时间(毫秒),输入非数字内容退出:100Result:Hello world,1001000次 BIO(同步)测试(睡眠100 毫秒):耗时(秒):9.8502858,QPS:    101.521000次 AIO(异步)测试(睡眠100 毫秒):耗时(秒):0.1149469,QPS:   8699.67请输入线程数:10000请输入此API方法的睡眠时间(毫秒),输入非数字内容退出:10Result:Hello world,1010000次 BIO(同步)测试(睡眠10 毫秒):耗时(秒):7.7966125,QPS:   1282.6110000次 AIO(异步)测试(睡眠10 毫秒):耗时(秒):0.083922,QPS: 119158.27请输入此API方法的睡眠时间(毫秒),输入非数字内容退出:100Result:Hello world,10010000次 BIO(同步)测试(睡眠100 毫秒):耗时(秒):34.3646036,QPS:    291.0010000次 AIO(异步)测试(睡眠100 毫秒):耗时(秒):0.1721833,QPS:  58077.64

结果表示,.NET程序开启10000个任务(不是10000个原生线程,需要考虑线程池线程),异步方法的QPS超过了10万,而同步方法只有1000多点,性能差距还是很大的。

注:以上测试结果的测试环境是 

Intel i7-4790K CPU,4核8线程,内存 16GB,Win10 企业版

 

以上就是.net中关于异步性能测试的示例代码的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432605.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
.NET Core中遇到的一些坑的图文详解
上一篇 2025年12月17日 08:27:23
下一篇 2025年12月17日 08:27:40

相关推荐

  • 样样超 Pro!感受一加 13 带来的性能与影像双重盛宴

    样样超 Pro!感受一加 13 带来的性能与影像双重盛宴样样超 Pro!感受一加 13 带来的性能与影像双重盛宴样样超 Pro!感受一加 13 带来的性能与影像双重盛宴样样超 Pro!感受一加 13 带来的性能与影像双重盛宴

    如果你追求极致的性能、顶级的屏幕显示效果、专业的影像体验,并且希望拥有一部兼具质感与实力的旗舰手机,那么一加 13 无疑是当前市场上的有力竞争者。它没有选择折叠形态,而是将所有 “pro” 级体验,浓缩在一部直板旗舰之中。 核心性能:骁龙 8 至尊版,释放极致潜能 一加 13…

    2026年9月9日 用户投稿
    000
  • 华硕启动 Android 16 Beta 测试 三款旗舰机型率先支持

    8 月 27 日,华硕正式启动 android 16 beta 测试项目,为部分高端机型用户带来抢先体验安卓下一代系统的机会。该项目最初于本月初面向 zenfone 12 ultra 开放报名,随后陆续覆盖 rog phone 9 系列机型。 目前可参与 Android 16 Beta 测试的设备包…

    2026年9月9日
    000
  • Laravel如何优化数据库查询_数据库性能调优技巧

    Laravel应用中最常见的数据库性能瓶颈包括N+1查询、缺少索引、SELECT 未指定列、不合理的大事务及复杂JOIN操作。N+1问题因循环中频繁查询关联数据导致数据库负载激增,可通过Eloquent的with()预加载解决;缺少索引会使WHERE、JOIN或ORDER BY操作引发全表扫描,应为…

    2026年9月9日
    000
  • MEOW R16 Ultra 高颜驾到!异次元拼图风,主打新潮外观和旗舰性能

    8 月 27 日,七彩虹旗下年轻化潮流品牌 colorfire 正式推出 meow 系列全新旗舰机型——meow r16 ultra。作为继 meow r16 标准版与 pro 版之后的又一力作,这款新品专为追求个性与性能兼备的年轻用户打造,进一步拓展品牌在潮流游戏本领域的影响力。 MEOW R16…

    2026年9月9日
    100
  • 鸿蒙微信1.0.6.35开启尝鲜:支持拉黑、设置聊天背景等功能 测试时间为4月27日-5月26日

    华为应用市场上,鸿蒙微信的1.0.6.35版本已开启尝鲜升级,测试时间为4月27日至5月26日。 此次升级带来了一系列功能的完善,包括新增拉黑朋友、设置聊天背景、将群聊保存到通讯录、以及面对面建群等功能。 值得一提的是,有用户反馈微信支付已支持指纹支付,但目前仍处于灰度推送阶段,仅部分用户可体验,升…

    2026年9月7日
    000
  • 如何优化ThinkPHP6应用程序的性能

    作为一款优秀的php框架,thinkphp6在开发web应用程序方面表现出色。然而,随着应用程序规模的增大以及用户量的不断增加,我们需要进一步优化程序的性能,以确保应用程序可以高效地运行。本文将介绍一些优化thinkphp6应用程序性能的方法。 使用缓存 对于需要频繁读取的数据,使用缓存可以大大减少…

    用户投稿 2026年9月7日
    000
  • vivox100s和x100区别:性能对比及功能解析

    vivo x100s和x100手机都是vivo手机产品线中的代表机型,它们分别代表了vivo在不同时间段内的高端技术水平,因此这两款手机在设计、性能和功能上均有一定区别。本文将从性能对比和功能解析两个方面对这两款手机进行详细比较,帮助消费者更好地选择适合自己的手机。 首先,我们来看vivo x100…

    用户投稿 2026年9月6日
    100
  • 骁龙8gen2性能媲美苹果哪一款处理器?

    骁龙8gen2性能媲美苹果哪一款处理器? 当谈到手机处理器时,骁龙和苹果的芯片往往是众多消费者关注的焦点。骁龙处理器由高通公司推出,一直以来在安卓手机市场占据着重要地位,而苹果则使用自家设计的A系列芯片,其性能一直备受称赞。最近,骁龙8gen2处理器发布,声称性能媲美苹果最新的处理器芯片,这引发了不…

    用户投稿 2026年9月5日
    000
  • Swoole如何实现高性能的数据备份

    近年来,数据备份已经成为企业信息化建设中必不可少的一个环节。随着企业业务量增大、数据量增加,传统的备份方案已经无法满足需求,因而出现了一些新的备份工具。swoole是一种基于php语言的高性能网络通信框架,其主要用于实现服务器应用程序。本文将介绍如何利用swoole实现高性能的数据备份。 一、备份数…

    用户投稿 2026年9月5日
    100
  • Laravel中的缓存管理和性能优化:提升应用程序的响应速度

    Laravel中的缓存管理和性能优化:提升应用程序的响应速度 引言:在开发Web应用程序时,性能是一个非常重要的考虑因素。用户对于快速响应的期待越来越高,因此,如何优化应用程序的性能就显得尤为重要。Laravel是一个流行的PHP框架,提供了许多能够加速应用程序的缓存管理工具和技术。本文将介绍Lar…

    2026年9月4日
    100
  • 解码Laravel性能瓶颈:优化技巧全面揭秘!

    解码Laravel性能瓶颈:优化技巧全面揭秘! Laravel作为一款流行的PHP框架,为开发者提供了丰富的功能和便捷的开发体验。然而,随着项目规模增大和访问量增加,我们可能会面临性能瓶颈的挑战。本文将深入探讨Laravel性能优化的技巧,帮助开发者发现并解决潜在的性能问题。 一、数据库查询优化 使…

    2026年8月31日
    400
  • 酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售

    酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售

    最近,笔记本行业不断涌现高性能轻薄本,各大品牌之间展开新一轮竞争。对消费者而言,高性能轻薄本恰到好处地结合了性能与便携性,突显了用户对笔记本的极致需求。 在这其中,以 ROG 幻 Air 为代表的专业性能轻薄本率先拉开帷幕。据悉,此次 ROG 带来幻 16 Air 和幻 14 Air 两款产品,分别…

    2026年8月31日 用户投稿
    100
  • 褒贬不一 《夜莺传说》帧数测试

    褒贬不一 《夜莺传说》帧数测试褒贬不一 《夜莺传说》帧数测试褒贬不一 《夜莺传说》帧数测试褒贬不一 《夜莺传说》帧数测试

    上个月《夜莺传说》突然来了波反向跳票,本应该在 2 月 23 日上线的游戏提前两天,国内地区于北京时间 2 月 21 日抢先上线,并同步登陆 steam 和 epic 商店。作为一款开放世界游戏,《夜莺传说》集生存、建造、探索、战斗、制作等诸多要素于一体,不过发售了一个月,玩家对这款游戏的评价褒贬不…

    2026年8月25日 用户投稿
    500
  • 静态重定位技术的优势与发展前景的研究

    探究静态重定位技术的优势与发展前景 技术的不断进步为我们带来了很多方便和效率,其中之一就是静态重定位技术。静态重定位技术是一种将程序加载到内存中的技术,通过修改程序中的地址,使其能够在不同的内存位置运行。本文将探究静态重定位技术的优势以及发展前景,并提供一些具体的代码示例作为参考。 静态重定位技术有…

    2025年12月24日
    400
  • 掌握网页性能受绘制和布局的影响

    了解重绘和回流对网页性能的影响,需要具体代码示例 简介:网页的性能是用户体验的关键因素之一。在优化网页性能的过程中,了解重绘和回流的概念及其对网页性能的影响非常重要。本文将详细讲解重绘和回流的含义,并举例说明它们对网页性能的影响。同时,提供一些优化的技巧和建议,以减少重绘和回流的次数,从而提升网页性…

    2025年12月24日
    400
  • 通过使用Web标准,提升网页性能与用户体验的方法

    随着互联网的快速发展,越来越多的企业和个人都开始关注网页的性能和用户体验。一方面,良好的网页性能可以提高网站的可访问性和搜索引擎排名,另一方面,优秀的用户体验可以增加用户的黏性和转化率。而借助Web标准来优化网页性能与用户体验,则成为现如今的一种主流方法。 那么,如何利用Web标准来优化网页性能与用…

    2025年12月24日
    000
  • CSS网页布局优化:提高网页加载速度和性能

    CSS 网页布局优化:提高网页加载速度和性能,需要具体代码示例 随着互联网的发展,用户对于网页加载速度和性能的要求越来越高。而对于网页开发者来说,优化网页布局是提高网页加载速度和性能的重要一环。在本文中,我们将分享一些实用的 CSS 优化技巧,并提供具体的代码示例。 选择合适的布局方式合适的布局方式…

    2025年12月24日
    000
  • 如何使用CSS3动画功能提升网页性能和用户体验

    如何使用CSS3动画功能提升网页性能和用户体验 在如今的互联网时代,网页设计已经成为了人们经常接触的一种艺术形式。而其中,动画效果在网页设计中起到了至关重要的作用,可以为用户呈现出更加生动、丰富的内容,提升用户的使用体验。然而,过多或不适当的动画效果也可能会给网页性能和用户体验带来负面影响。本文将介…

    2025年12月24日
    500
  • 提高css性能的方法

    这篇文章主要介绍了css性能优化提高css性能的方法,不规范的css会导致很多性能问题,所以学习掌握css性能优化技巧是非常必要的,对css性能优化知识感兴趣的朋友一起学习吧 不规范的css会导致很多性能问题,这些问题可能在一些小的项目中不够明显,但是在大型项目中就会显现出来。 css匹配原理 在优…

    用户投稿 2025年12月24日
    000
  • 阐述什么是CSS3?

    网页制作Webjx文章简介:CSS3不是新事物,更不是只是围绕border-radius属性实现的圆角。它正耐心的坐在那里,已经准备好了首次登场,呷着咖啡,等着浏览器来铺上红地毯。            CSS3不是新事物,更不是只是围绕border-radius属性实现              …

    用户投稿 2025年12月23日
    100

发表回复

登录后才能评论
关注微信