最近广州.NET微软技术俱乐部对如何编写高性能.NET程序发起了讨论。
 
首先是在ORM和SQL方面进行了讨论,主题当然是经久不衰的月经贴: EF性能很差.
Edi.Wang专门写了一篇文章<Entity Framework 的一些性能建议> 说明了只要正确使用EF, 性能并不差.
我自己用EF十年了, 也没有感觉到EF性能差. 我的解决方法是把EF最常见性能瓶颈,比如审计日志进行优化. 之前是异步记录日志, 最近的做法是术业有专攻, 记录日志就扔给最擅长做日志的ELK组合去做. 同时ABP的审计日志也是用EF的,在大型项目里面性能也不差,详情可以看我的另一篇文章:《ABP大型项目实战(2) - 调试与排错 - 日志 - 查看审计日志》。这可是既有大量数据又有多表关联查询哦。
 
可见, .NET性能并不差, 而且随着.NET的不断进步, 优化门槛越来越低, 只要你找到获取这类知识的渠道,花点时间, 很快就可以编写出高性能的.NET程序.
 
然后又说到FP(函数式编程).
FP(函数式编程)是一种和OOP(面向对象编程)不一样的编程方式.
对于OOP(面向对象编程), 绝大多数人都知道.
然而对于FP(函数式编程), .NET俱乐部里的绝大多数人并没有感觉, 因为感觉日常没有用到啊, 而且FP类编程语言Erlang和Go距离我们.NET程序员太远了.
其实.NET俱乐部里的绝大多数人都用过FP, 只要用过前端三大框架(Angular/React/Vue)的朋友们都用过FP了. 比如如下代码:

this.XXXService.getPagedXXXList(
this.filterText,
request.sorting,
1000, // request.maxResultCount,
0// request.skipCount,
)
.finally(() => {
finishedCallback();
})
.subscribe(result => { //这里用到了FP(函数式编程)
this.dataList = result.items;
this.totalItems = result.totalCount;
this.showPaging(result);
this.loading = true; });

  

哈哈, 看到这段代码是否恍然大悟, 原来我天天都在用FP啊!
那么FP是什么时候很低调的活在我们日常代码中呢? 为啥他兄弟OOP如此高调,他却如此低调?
OOP在行业里风风火火几十年,但是到了2005年,摩尔定律在单核CPU性能上达到了物理极限!单核时代到了尽头,多核时代开始了!《Concurrency in .NET》一书的第一章对此有详细描述。
OOP在几十年前提出的时候并没有考虑到多核这种情况。OOP在多核时代暴露了很多缺陷!
当然OOP在多核时代依旧能工作,很多朋友们现在依然在用OOP写程序,但是本文的主题是《编写高性能.NET程序》!!!要想编写高性能.NET程序,就必须要尽量利用多核CPU性能。OOP在这方面具有很多缺陷。
 
而FP的众多特性,比如不可变性,十分适合多核CPU时代,于是FP开始崛起了。随着时间的推移,FP的库开始多起来了,比如.NET里就有Rx.NET这个著名的FP库。
FP不知不觉发展了10年,来到了2015年,随着前端三大框架(Angular/React/Vue)推出,前端开始爆发,FP终于被绝大多数程序员不知不觉的使用了。
 
所以,如果你不满足于仅仅是API调用者,你要编写高性能.NET程序,你要榨干多核CPU的性能,那你必然要开始了解FP了。
 
除了FP之外,《Concurrency in .NET》一书还提供了很多种方法去榨干多核CPU的性能,比如TPL/Dataflow。我会继续写这一系列,在后面的笔记里,你会接触到很多你在日常代码中每天都看到的技术名词,比如async, await关键字, task等类型,但是你可能熟视无睹了。希望你看了这本书或者我这系列笔记之后,不要再说.NET性能差了。
 
什么?《Concurrency in .NET》目前只有英文版?不要着急,据可靠渠道的可靠消息,很快就会有中文版的啦!等中文版出来后,我会通知大家的。
 
Q&A:
  1. 为了利用多核CPU性能和使用FP,我要放弃C#去学习一门新的语言吗?
    答:不需要,随着C#的不断进步,C#添加了很多关键字和类型去利用多核CPU性能,比如async, await, task,C#也有了FP库,比如Rx.NET,所以你不需要放弃C#,你继续使用C#就可以了。
  2. 这本书和这系列笔记和.NET本质论等赵三本有啥区别?
    答:.NET本质论这类书出版的时候多核CPU时代还没到来,所以这类书籍并没有对.NET如何利用多核CPU进行描述,而这本书和我这系列笔记则是专门针对多核CPU的。

编写高性能.NET程序-《Concurrency in .NET》(1)- 为什么要读这本书?的更多相关文章

  1. 编写高性能Web应用程序的10个技巧

    这篇文章讨论了: ·一般ASP.NET性能的秘密 ·能提高ASP.NET表现的有用的技巧和窍门 ·在ASP.NET中使用数据库的建议 ·ASP.NET中的缓存和后台处理 使用ASP.NET编写一个We ...

  2. 编写高性能 Web 应用程序的 10 个技巧

    使用 ASP.NET 编写 Web 应用程序的简单程度令人不敢相信.正因为如此简单,所以很多开发人员就不会花时间来设计其应用程序的结构,以获得更好的性能了.在本文中,我将讲述 10 个用于编写高性能 ...

  3. 转自微软内部资料:编写高性能 Web 应用程序的 10 个技巧

    编写高性能 Web 应用程序的 10 个技巧 转自微软资料数据层性能技巧 1 — 返回多个结果集技巧 2 — 分页的数据访问技巧 3 — 连接池技巧 4 — ASP.NET 缓存 API技巧 5 — ...

  4. 【JavaScript】【译】编写高性能JavaScript

    英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执 ...

  5. 编写高性能JavaScript【转】

    英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执 ...

  6. [转]编写高性能的Lua代码

    昨天晚上闲来无事,看室友在电脑上挂机玩游戏,用的一个辅助脚本,以为是lua写的脚本在跑,实际调查发现是按键精灵的脚本. 于是在网上找相关Lua开发游戏脚本的案例,看到一个人的博客,内容很不错,学到了很 ...

  7. 编写高性能的Lua代码

    编写高性能的Lua代码 Posted on2014/04/18· 10 Comments 前言 Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏.像<魔兽世界>的插件, ...

  8. 编写高性能的 Lua 代码

    前言 Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏.像<魔兽世界>的插件,手机游戏<大掌门><神曲><迷失之地>等都是用Lua来 ...

  9. .NET Core 3.1 编写混合 C++ 程序

    前言 随着 .NET Core 3.1 的第二个预览版本发布,微软正式将 C++/CLI 移植到 .NET Core 上,从此可以使用 C++ 编写 .NET Core 的程序了. 由于目前仅有 MS ...

随机推荐

  1. Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

    一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...

  2. 主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc

    背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 . NOTE: 本文所有测试均是MySQL库 测试结论 1:性能方面 hikariCP> ...

  3. 阿里面试100%问到,JVM性能调优篇

    JVM 调优概述 性能定义 吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标. 延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集 ...

  4. [Swift]LeetCode41. 缺失的第一个正数 | First Missing Positive

    Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...

  5. [Swift]LeetCode648. 单词替换 | Replace Words

    In English, we have a concept called root, which can be followed by some other words to form another ...

  6. docker 常用命令记录

    下载镜像 docker pull imagesName 查看所有镜像 docker images 查看当前运行的镜像 docker ps 运行镜像 docker run imagesName 停止运行 ...

  7. Chapter 4 Invitations——12

    "I don't know what you mean," I said, my voice guarded. “我不知道你什么意思”我声音谨慎地说道. "It's be ...

  8. Jvm垃圾回收器(算法篇)

    在<Jvm垃圾回收器(基础篇)>中我们主要学习了判断对象是否存活还是死亡?两种基础的垃圾回收算法:引用计数法.可达性分析算法.以及Java引用的4种分类:强引用.软引用.弱引用.虚引用.和 ...

  9. iOS逆向开发(8):微信自动添加好友

    这一次,小程演示怎么让一个APP自动地运行,从而代替手工的操作.同样以"微信"以例,实现在一个微信群里面,对所有的成员,自动地一个一个地发出添加好友的请求. 知识点还是之前介绍的东 ...

  10. SpringCloud-Greenwich版本新特性探索(1)---SpringCloudGateway

    一.前言 1.SpringCloudGateway是SpringCloud新推出的网关框架,比较于上一代Zuul,功能和性能有很大的提升.Zuul1.x采用的是阻塞多线程方式,也就是一个线程处理一个连 ...