編寫高效能.NET程式-《Concurrency in .NET》(1)- 為什麼要讀這本書?
最近廣州.NET微軟技術俱樂部 對如何編寫高效能.NET程式發起了討論。
首先是在ORM和SQL方面進行了討論,主題當然是經久不衰的月經貼: EF效能很差.
Edi.Wang專門寫了一篇文章<Entity Framework 的一些效能建議 > 說明了只要正確使用EF, 效能並不差.
我自己用EF十年了, 也沒有感覺到EF效能差. 我的解決方法是把EF最常見效能瓶頸,比如記錄日誌進行優化. 之前是非同步記錄日誌, 最近的做法是術業有專攻, 記錄日誌就扔給最擅長做日誌的ELK組合去做.
可見, 只要方法得當, .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的效能。我會繼續寫這一系列,在後面的筆記裡,你會接觸到很多你在日常程式碼中每天都看到的技術名詞,比如async, await, task關鍵字,但是你可能熟視無睹了。希望你看了這本書之後,不要再說.NET效能差了。
什麼?《Concurrency in .NET》目前只有英文版?不要著急,據可靠渠道的可靠訊息,很快就會有中文版的啦!