关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C#中,async关键字具体起什么作用?

发布时间:2020-01-21 17:13:51

对于C#的这些“优雅”“高级”的特性,使用一定慎之又慎,在使用时,一腚,一腚要紧盯性能曲线,多做压力测试,有问题当场干掉,不要留坑。

.Net架构在许多地方对GC问题极不重视,然而千里之堤毁于蚁穴,问题攒到最后哭的是自己。

盲目追求“高级”不可取,许多程序员,尤其是年轻一代的程序员(实际上我本人也才刚20+,也算“年轻一代”之一#手动斜眼#),总认为新的,高级的就应该多接受,甚至还有“现在电脑硬件那么好不差这一点性能”这样荒谬的说法,这样的做法无疑是每天在自己脚下挖一撮土,挖到最后变成一个大坑了自己也出不去了……

补充一下吧,首先呢我说的应用方向肯定是对性能有高要求的研究方向,对性能要求不高的开发领域当然就不在我们讨论的范畴内了。说到异步,在开发过程中异步和并行多线程的概念确定一定是要分开的。比如网络IO一般属于低消耗但是长等待的,这种情况下可以开async thread 让其始终处于等待状态,而一些任务,比如之前提到的剔除排序,基本都是需要高度并行+同步的。结果不可能等待(没有人会想要在几秒钟之后看到当前游戏的这一帧),这种情况下启动线程看起来就是一种很愚蠢的做法了,甚至开线程本身的消耗比运算还要高。

在Intel的PPT中,不止一次的提到了Job Scheduler和Command Buffer这些字眼,也就是将需要执行的任务提前分配好,线程也提前开好并等待,任务与任务之间使用链式关系连接,保证上一条结束之前下一条不会开始执行,防止出现冲突。这样做的好处在于只需要启动一次或寥寥几次线程,把所有的任务攒到一起执行,同时对于并行逻辑,执行的方法一样(比如都是来自同一个Interface),可以使用SIMD等方法进行优化。

这样做可以说已经保证了并行时超高的性能,然而还是有几点需要注意一下。

为什么要用多线程?当然,充分利用的多线程肯定比单线程要快,然而我想说的是为什么不用并行能力更高的设备,比如GPGPU/CUDA来运算?因此需要编写并行逻辑时要考虑这个逻辑是否对灵活性有足够高的要求,必须用CPU而不是其他设备。

尽可能使用非托管资源。除了让人咬牙切齿捶胸顿足的GC问题,托管资源还存在使用指针访问时的不安全隐患以及编辑器本身的诸多限制。C# 7.x的新特性比如return ref,unmanaged类型,再加上已经比较成熟的unsafe,是完全可以自己导入一套库手动进行memory allocate的,如果没有现成的,自己用C++导出一个dll也是分分钟的事(大一C语言总学过吧23333)。

保证数据紧凑性,当CPU并发多线程飙起来以后,CPU缓存的压力成倍增加,这种情况下我们就应该尽可能保证数据紧凑。配合上一条说过的非托管资源,当我们有数种来自五湖四海的不同的数据时,直接new XXX[]显然是对缓存不友好的办法。而自己手动malloc并计算指针偏移,同时计算好系统线程数与并行任务数的比例,保证同一个线程内尽可能使用相对连续的一段数据,最大限度的降低cache miss。

Data oriented design,配合2,3条,在需要并行时传统面向对象的方法很容易产生缓存不友好的情况,这种时候统一调用,统一管理数据,分离数据与逻辑看起来会是更好的主意



相关阅读

云南首个新餐饮云平台-翼通云新餐饮应疫情上线认识什么是js闭包Python3标准库:operator内置操作符的函数接口R语言入门:矩阵和数组的运算flutter的取得成功Flink 融合 Apollo,动态性升级 Flink 工作配备C3#中如何重写object虚方法应用Visual Studio Comunity 2019开发设计Unity C#脚本制作沒有全自动补齐的解决方案C#如何快速实现完整的INI文件读写类C#设定自定文件图标保持双击鼠标起动C#中实现保持文档拖拽开启的方式WPF:客户控制库应用資源词典的疑惑The finally block does not always execute in try finallyC#:checked unchecked初识DjangoEffective C#:基于任务的异步编程flex延展性盒模型合理布局你弄懂了吗?npm环境下如何安裝Vue.js熟悉vue目录结构初步学习Vue.js关于Vue.js的条件与循环vue循环语句使用v-for 指令Vue.js计算属性关键词:computedVue.js 监听属性:通过 watch 来响应数据的变化电脑浏览器中普遍的html词义化标识运用chrome的overrides实时调试网上jsnodejs对字符串数组开展base64变换和分析关于js中函数的默认值与动态参数arguments的总结jquery幻灯片淡入淡出组件封装node 上传照片到七牛jquery滑动效果的运动模块封装ES6:教你用js面向对象思维来实现 tab栏增删改查功能前端的js构造函数和原型通过H5C3完成响应式网页(VIVO官网)ES6中的class(类)如何正确使用pocsuite3Apache Solr JMX服务项目 RCE 系统漏洞重现SharePoint 总体目标浏览人群SharePoint 2016 建立空白页网站Apache Shiro 授权关于2020年JAVA大厂笔经面经分享idea激话实例教程(永久性)适用2019 3.1 测试Go技术性人民日报(2020java map中根据value排序取前nFlutter中的this和this.widget有何差别?应用pandas挑选出特定列值所相匹配的行关于C语言指针的学习总结Java面向对象C++中常见的涵数有哪些?python异常处理会使用到哪些关键字?java开发设计JSP学员成绩管理系统 源代码根据JSP+Servlet开发设计java商场平时智能管理系统源代码python3-cookbook认识python 初学者须知Java 比较器python3-cookbook我的潘多拉深入理解Java虚拟机中的垃圾回收云南旅游网站设计需要有那些内容云南商城网站的支付安全如何维护云南为什么我们都是不建议使用模板建站的原因云南网站建设之中最容易被忽视的读小细节云南企业网站要突显特色要建设那些栏目云南网站中不同的背景颜色代表什么云南网站优化之程序优化云南医疗行业网站建设的注意事项云南网站后期的运营费用组成部分云南手表行业网站设计要点C#与Windows Form之间正确传值方法代码C++中如何产生不重复的随机数非常使用的技巧:次要关键字排序方法Matlab字符串分割详情取模(mod)与取余(rem)是一样的吗?如何区分?matlab svd 和 eig 之间如何区分C#中使用PictureBox来播放视频的代码分享Linux中使用内存映射文件MMF实现大数据量导出时的内存优化关于3年多前端菜鸡的面试及知识梳理与总结PyCharm教程安装,Python开发人员的强有力专用工具《Java 8 in Action》Chapter 12:新的日期和时间API环球在线新闻中心杨主任对我司谭昱同志的表彰【第7篇】如何理解asp.net core 3.x Identity系统Visual Studio Code如何设置Blazor clientEF CORE中复杂类型的映射C#个推SDK推送安卓+iOS.NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect怎么解决WPF:基本动画dotnetcore3.1 WPF 保持多語言IntroWPF中如何自定义一个“传统”的 Validation.ErrorTemplate控件?Wpf:编码导进XamlASP.NET MVC通用性权限管理系统(回应合理布局)源代码升级详细介绍异步调用时间轴文本框弹出来载入数据信息C# MemoryCache学习笔记C#中如何获得键盘钩子,同时屏蔽键盘按键ASP.NET Core Razor 主视图预编译、动态性编译怎么实现ABP架构转移到Mysql解析博图数据块(昆仑通态触摸屏自动命名)C# 制作关键字醒目显示控件Windows后台管理守护进程iNeuDaemon直接使用汇编编写 .NET Standard 库MyEclipse10安装下载破译及简体中文版含有jdk8u241以及帮助文件
/template/Home/Zkeys/PC/Static