最近广州.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:
- 为了利用多核CPU性能和使用FP,我要放弃C#去学习一门新的语言吗?
答:不需要,随着C#的不断进步,C#添加了很多关键字和类型去利用多核CPU性能,比如async, await, task,C#也有了FP库,比如Rx.NET,所以你不需要放弃C#,你继续使用C#就可以了。 - 这本书和这系列笔记和.NET本质论等赵三本有啥区别?
答:.NET本质论这类书出版的时候多核CPU时代还没到来,所以这类书籍并没有对.NET如何利用多核CPU进行描述,而这本书和我这系列笔记则是专门针对多核CPU的。