最近广州.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. 微信小程序用户信息解密失败导致的内存泄漏问题。

    微信小程序获取用户解密的Session_key 然后对 encryptedData进行解密 偶尔报错 时间长了之后会报内存溢出: java.lang.OutOfMemoryError: GC over ...

  2. 养成这8个编程习惯,你的Python性能将蹭蹭蹭地往上涨

    Python不以性能见长,但掌握一些技巧,也可尽量提高程序性能,避免不必要的资源浪费. 1. 使用局部变量 尽量使用局部变量代替全局变量:便于维护,提高性能并节省内存. 使用局部变量替换模块名字空间中 ...

  3. Javascript中的this关键字用法详解

    在javascript里面,this是一个特殊的对象,它不像其他编程语言那样,是存储在实例中的值,直接指向此实例. 而是作为一个单独的指针,在不同的情况之下,指向不同的位置,这也是为什么我们会将它搞混 ...

  4. [Swift]LeetCode344. 反转字符串 | Reverse String

    Write a function that takes a string as input and returns the string reversed. Example 1: Input: &qu ...

  5. [Swift]LeetCode833. 字符串中的查找与替换 | Find And Replace in String

    To some string S, we will perform some replacement operations that replace groups of letters with ne ...

  6. [Swift]LeetCode956. 最高的广告牌 | Tallest Billboard

    You are installing a billboard and want it to have the largest height.  The billboard will have two ...

  7. 本地安装MySQL详细教程

    第1章   MySQL的安装与使用 1.1  MySQL安装与配置 1.1.1 MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“set ...

  8. 十分钟通过 NPM 创建一个命令行工具

    大过年的,要不要写点代码压压惊?来花十分钟学一下怎么通过 NPM 构建一个命令行工具. 写了一个小 demo,用于代替 touch 的创建文件命令 touchme ,可以创建自带“佛祖保佑”注释的文件 ...

  9. Vue中实现一个无限加载列表

    参考 https://www.jianshu.com/p/0a3aebd63a14 一个需要判断的地方就是加载中再次触发滚动的时候,不要获取数据. <!DOCTYPE html> < ...

  10. .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

    写在前面 上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概念!如果大家把前面几张都理解了 ...