一位在微軟工作的台灣工程師 Bruce 以捐錢給公益機構的方式當作學費,來給我們上了一堂 .NET 相關 Performance 的課程
還有說了一些微軟的文化上的事情
https://docs.google.com/presentation/d/1ppzgkTQcx_vlW4K1kyBjGvYXpIHCbE5U_ULt-0j_JQ8/edit#slide=id.p7
今天去上的課程的簡報,一些點記錄一下
- 講者背景
- 主講者是目前的 Team 是負責 VS WebTools 那塊,所有的關於 Web 的東西包含 Azure 的東西都是他們 Team 做的
- 他們 WebTools 目前累積的 Tests (Unit Test / Integration Test) 的量約 4000+ 條(大汗),其實 Test 裡面也是可以用來測量一下你們的效能的
- General
- 效能其實可以看做時間和空間取捨之後的結果
- 效能調教的四個層級,從 你的code => API in .NET Framework => .NET CLR => Machine Code,越右邊你能控制的越少
- 心裡OS:其實覺得到第二層就沒辦法控制啦~XD 推給微軟就對了XD
- .NET Framework 裡面 Stack / Queue 的實做是直接用陣列去做的,不是 linked list
- BigO 是常用來計算效率的方式相信大家都知道,能夠被 BigO 來計算的稱為 P(polynomial),但其實真實世界在一些複雜的問題是是沒有辦法用 BigO 來描述效率的,就是所謂的 NP (non-deterministic polynomial),NP的問題例如:最短路竟規劃、最佳排程
- GC
- GC 做動的時候會停止所有的 Thread
- 實做 IDispose 的意思不是 GC 會幫你執行,而是GC的時候會他看到你實做 IDispose 基本上會跳過你,你必須要自己去釋放,也難怪人家說如果東西有提供 Dispose method 請麻煩自己呼叫
- 沒事不要實做 IDispose,除非你有用到 Un-Managed resource 要提供開發者能夠自己釋放的機制
- 心裡OS:大驚
- 沒事不要實做 IDispose,除非你有用到 Un-Managed resource 要提供開發者能夠自己釋放的機制
- Heap 分兩塊,一塊是小object在用的(又細分為 Gen 0 => Gen 3 ),一塊是大object在用的
- 物件活在數字越大的 Gen 表示該物件越常被用到,亦即數字越大的 Gen 就會越少偵測活收的動作
- 觸發每個 Gen 的大小分別為 Gen 0 256KB, Gen 1 2MB, Gen 2 未知
- Large Heap 是當你的 object 佔用超過約 85KB 的就會放在這邊
- GC 的模式有分 WorkStation, Server, Background, Low Latancy,其中 Low Latancy 意思就是不做GC (這麼拼?)
- 預設模式是WorkStation
- 透過 App.Config 可以去調整
- 自己補充:不過我記得在 WP 時代用的GC似乎是有新的方式?
- 自己補充:不知道 WinRT or .NET Native 上面的機制是否相同
- class vs struct 的選擇
- struct 在 stack 所以不會有 GC
- 心裡OS:其實還是很難抉擇到底要啥時可以用 struct,即便他真的只是一個單純的「容器」
- struct 在 stack 所以不會有 GC
- 大 object 盡量使用同一個 reference,或者建立 pooling 機制
- WeakReference use for cache (為主) ,意思就是不見也不會怎樣的狀況就用 WeakReference
- JIT
- LINQ, dynamic, regx, param arrays, iterators, cast and converter 等會產生比較多 code
- 能不用 dynamic 就不要
- NGEN
- 心裡OS:對於 NGEN 的未來是 .NET Native 有點覺得奇妙,雖然.NET Native 會是個其中一個趨勢,不過總覺得 NGEN 和 .NET Native 出來的目的上還是有差別(? anyway 只是覺得好像那邊怪怪的,雖然兩者都是先幫你轉換成 native code
- LINQ, dynamic, regx, param arrays, iterators, cast and converter 等會產生比較多 code
- async programmiing
- 盡可能有 .NET 有提供 Async method 就用吧!
- 可以先用 ContinueWith 串好一切的東西去做事
- ConfigureAwait(false) 的意思表示切換到不同的 thread 做事情後,回來可以"不用"回到同一個Thread,Context 還是會在
- string
- 幾乎任何字串的更動都是產生一塊新的空間
- += vs string.Format => += 比較快,但是 format 比較好看
- 附註:基本上沒也特別理由,code review 會被挑出來為什麼不用 format 要用 +=
- 比較字串用 string.Compare,如果要忽略比較大小就加上參數即可,不要用 ToUpper or ToLower ,因為會產生新字串(記憶體)
- 工作文化
- 文化... 美國的文化就是沒有文化 (XD
- 不過不同文化還是需要多瞭解
- 別人要求你私下做事情基本上是不可以的,一定要經過老闆允許
- 上班時間早到早走(講者是 8點上班,忙得時候最晚七八點下班,沒事得時候四點半就下班了)
- PM 說了算,但是 PM 如果有要刻的 UI ,PM不一定會有清楚的想像
- 附註:不過沒提到 Schedule 有問題是怎樣處理,記得之前聽說就是砍 Feature 就對了
- PM 跟 RD 是坐在一起,有問題就問
- 附註:如同之前聽到微軟轉型 Scrum 的說法相同
- 他們團隊的 brach 就是 master / dev
- 沒聽錯的話,有一個狀態是比較特別的,是所謂的要 release 出去的版本連 bug 要修是都不能動的,如果要動是必須要請示長官
- 因為要影響 Schedule ,而 on schedule 是最重要的!因為 Schedule 是答應客戶的時間(客戶比較大)
- 所有其他的問題留待下一個 sprint 再處理
- 我們知道如何衡量 Performance ,你知道如何衡量你的人生嗎?
- https://www.youtube.com/watch?v=qfTPJld4RNo (TED Talk)
- 附註:建議聽聽,最後如果轉換到神那邊有點無法接受但不要否定前面的內容
- https://www.youtube.com/watch?v=qfTPJld4RNo (TED Talk)
以上... 大概是這樣...如有疏漏或謬誤也請多多指教
PS:有七位MVP出息去聽!!