[心得] .Net 技術討論課程公益活動 之 撰寫高效率 .Net Code

一位在微軟工作的台灣工程師 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:大驚
    • 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,即便他真的只是一個單純的「容器」
    • 大 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
  • 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)
      • 附註:建議聽聽,最後如果轉換到神那邊有點無法接受但不要否定前面的內容

 

以上... 大概是這樣...如有疏漏或謬誤也請多多指教

PS:有七位MVP出息去聽!!