当前位置: 首页 > news >正文

台州建网站贵阳中企动力做的网站

台州建网站,贵阳中企动力做的网站,利于seo的网站设计,网站后台管理系统教程很久没有写博客了#xff0c;今年做的产品公司这两天刚刚开了发布会#xff0c;稍微清闲下来#xff0c;想想我们做的产品还有没有性能优化空间#xff0c;于是想到了.Net的异步可以优化性能#xff0c;但到底能够提升多大的比例呢#xff1f;恰好有一个朋友正在做各种语…很久没有写博客了今年做的产品公司这两天刚刚开了发布会稍微清闲下来想想我们做的产品还有没有性能优化空间于是想到了.Net的异步可以优化性能但到底能够提升多大的比例呢恰好有一个朋友正在做各种语言的异步性能测试有关异步和同步的问题请参考客《AIO与BIO接口性能对比》于是我今天写了一个C#的测试程序。 首先建一个 ASP.NET MVC WebAPI项目在默认的控制器 values里面增加两个方法 // GET api/values?sleepTime10[HttpGet]public async Taskstring ExecuteAIO(int sleepTime){await Task.Delay(sleepTime);return Hello world, sleepTime;}[HttpGet]// GET api/values?sleepTime210public string ExecuteBIO(int sleepTime2){System.Threading.Thread.Sleep(sleepTime2);return Hello world, sleepTime2;} 然后建立一个控制台程序来测试这个web API 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;}} 其实主要是下面几行代码 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方法的睡眠时间毫秒,输入非数字内容退出10 Result:Hello world,10 1000次 BIO同步测试(睡眠10 毫秒) 耗时秒1.2860545,QPS: 777.57 1000次 AIO异步测试(睡眠10 毫秒) 耗时秒0.4895946,QPS: 2042.51 请输入此API方法的睡眠时间毫秒,输入非数字内容退出100 Result:Hello world,100 1000次 BIO同步测试(睡眠100 毫秒) 耗时秒8.2769307,QPS: 120.82 1000次 AIO异步测试(睡眠100 毫秒) 耗时秒0.5435111,QPS: 1839.89 本来想尝试测试10000个线程但报错了。 上面的测试结果QPS并不高但由于使用的是IISExpress不同的Web服务器软件性能不相同所以还得对比下进程内QPS结果于是新建一个控制台程序代码如下 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.Runstring(() 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 Taskstring 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;}} 注意关键代码只有下面两个方法 public static async Taskstring 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.Runstring(() 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方法的睡眠时间毫秒,输入非数字内容退出10 Result:Hello world,10 1000次 BIO同步测试(睡眠10 毫秒) 耗时秒1.3031966,QPS: 767.34 1000次 AIO异步测试(睡眠10 毫秒) 耗时秒0.026441,QPS: 37820.05 请输入此API方法的睡眠时间毫秒,输入非数字内容退出100 Result:Hello world,100 1000次 BIO同步测试(睡眠100 毫秒) 耗时秒9.8502858,QPS: 101.52 1000次 AIO异步测试(睡眠100 毫秒) 耗时秒0.1149469,QPS: 8699.67请输入线程数10000 请输入此API方法的睡眠时间毫秒,输入非数字内容退出10 Result:Hello world,10 10000次 BIO同步测试(睡眠10 毫秒) 耗时秒7.7966125,QPS: 1282.61 10000次 AIO异步测试(睡眠10 毫秒) 耗时秒0.083922,QPS: 119158.27 请输入此API方法的睡眠时间毫秒,输入非数字内容退出100 Result:Hello world,100 10000次 BIO同步测试(睡眠100 毫秒) 耗时秒34.3646036,QPS: 291.00 10000次 AIO异步测试(睡眠100 毫秒) 耗时秒0.1721833,QPS: 58077.64 结果表示.NET程序开启10000个任务不是10000个原生线程需要考虑线程池线程异步方法的QPS超过了10万而同步方法只有1000多点性能差距还是很大的。 注以上测试结果的测试环境是  Intel i7-4790K CPU4核8线程内存 16GBWin10 企业版 总结: 不论是普通程序还是Web程序使用异步多线程可以极大的提高系统的吞吐量。 后记 感谢网友“双鱼座” 的提示我用信号量和都用线程Sleep的方式对同步和异步方法进行了测试结果如他所说TPL异步方式开销很大下面是测试数据 使用 semaphoreSlim 的情况请输入线程数1000 请输入此API方法的睡眠时间毫秒,输入非数字内容退出10 Result:Hello world,10 1000次 BIO同步测试(睡眠10 毫秒) 耗时秒1.2486964,QPS: 800.84 1000次 AIO异步测试(睡眠10 毫秒) 耗时秒10.5259443,QPS: 95.00 请输入此API方法的睡眠时间毫秒,输入非数字内容退出100 Result:Hello world,100 1000次 BIO同步测试(睡眠100 毫秒) 耗时秒12.2754003,QPS: 81.46 1000次 AIO异步测试(睡眠100 毫秒) 耗时秒100.5308431,QPS: 9.95 请输入此API方法的睡眠时间毫秒,输入非数字内容退出1000 Result:Hello world,1000 1000次 BIO同步测试(睡眠1000 毫秒) 耗时秒54.0055828,QPS: 18.52 1000次 AIO异步测试(睡眠1000 毫秒) 耗时秒1000.4749124,QPS: 1.00 使用线程 Sleep的代码改造 public static async Taskstring ExecuteAIO(int sleepTime){//await Task.Delay(sleepTime);//return Hello world, sleepTime;//await Task.Delay(sleepTime);//semaphoreSlim.Wait(sleepTime);System.Threading.Thread.Sleep(sleepTime);return await Task.FromResult(Hello world, sleepTime);}public static string ExecuteBIO(int sleepTime2){System.Threading.Thread.Sleep(sleepTime2);//semaphoreSlim.Wait(sleepTime2);//不能在非异步方法里面使用 Task.Delay否则可能死锁//Task.Delay(sleepTime2).Wait();return Hello world, sleepTime2;} 运行结果如下 请输入线程数1000 请输入此API方法的睡眠时间毫秒,输入非数字内容退出10 Result:Hello world,10 1000次 BIO同步测试(睡眠10 毫秒) 耗时秒1.3099217,QPS: 763.40 1000次 AIO异步测试(睡眠10 毫秒) 耗时秒10.9869045,QPS: 91.02 请输入此API方法的睡眠时间毫秒,输入非数字内容退出100 Result:Hello world,100 1000次 BIO同步测试(睡眠100 毫秒) 耗时秒8.5861461,QPS: 116.47 1000次 AIO异步测试(睡眠100 毫秒) 耗时秒100.9829406,QPS: 9.90 请输入此API方法的睡眠时间毫秒,输入非数字内容退出1000 Result:Hello world,1000 1000次 BIO同步测试(睡眠1000 毫秒) 耗时秒27.0158904,QPS: 37.02 1000次 AIO异步测试(睡眠1000 毫秒) 在每次睡眠1秒的异步方法测试中很久都没有出来结果不用考虑QPS肯定低于一秒了。 经验教训 在异步方法中不要使用 Thread.Sleep在同步方法中不要使用Task.Delay 否则可能出现线程死锁结果难出来。
http://www.yutouwan.com/news/400691/

相关文章:

  • 请人做网站 说我要求多建筑施工企业
  • 罗湖商城网站设计多少钱做外链的网站
  • 广州工信部网站查询网站为什么上传不了图片
  • 做招聘网站赚钱么做文学网站编辑的前景
  • 网站建设需要的资质wordpress谁开发的
  • 大连公司网站开发山东省住房和建设厅注册中心网站
  • 甘肃建设厅官方网站东圃做网站
  • 河源市网站建设公司wordpress官方中文主题
  • 办公设备网站推广怎么做wordpress调节宽度
  • 抽奖的网站怎么做的什么网站可以做软件有哪些东西
  • 家政公司网站模板找设计案例的网站
  • 网站内容规划要包括什么内容湖南省城乡和住房建设厅网站
  • wap网站制作软件移动端低代码开发平台
  • 网站首页改版方案wordpress postfix
  • 企业网站开发韵茵建站哪个网站可以做思维导图
  • 深圳宝安网站建设公司宁波网站建设股份公司
  • asp做网站主要技术全球最大设计网站
  • 医院网站建设投标要求seo营销推广费用
  • 贵州小程序制作开发南宁seo优化
  • 宝安官网网站建设比较好的如何将优酷视频放到自己的网站
  • 有什么做衣服的网站好麓谷网站建设公司
  • 网站改版报告游戏下载网站 wordpress
  • 网站设计可以用性原则网站模板购买 优帮云
  • 泰安做网站收录快的门户网站
  • 网站源码上传完后怎么做南京网站搜索引擎优化
  • 时空网站建设的可行性分析石家庄做网站seo
  • 商标设计网站哪个好网站 建设原则
  • 诸城网站制作运动鞋网站建设目的
  • 商城网站开发价格做的网站怎么放视频
  • 邯郸网站建设地方我的网站不做推广 百度能搜索到我网站吗