還在徒手揮汗寫For測效能,閃開讓BenchmarkDotNet來

還在徒手揮汗寫For測效能,閃開讓BenchmarkDotNet來

上集使用反射執行方法的7種方式我們談到寫法不同,效果不同這件事,也說到,通常我們測試程式效能會很習慣的採用 Stopwatch 模式(Stopwatch Pattern)來進行程式執行效率的比較。

Stopwatch sw = new Stopwatch();
sw.Start();
// stuff
sw.Stop();

我們把前面的 7 Ways 程式碼用 for 跑 20000 次計算時間,可以得到以下結果:

Way1 Time: 40 ms
Way2 Time: 40 ms
Way3 Time: 76 ms
Way4 Time: 67 ms
Way5 Time: 148 ms
Way6 Time: 4233 ms
Way7 Time: 2054 ms
  

但這樣對嗎?在談效率時,其實有二種意義:時間空間(文言文:時間複雜度空間複雜度),我不是來說教書的,雖然 Stopwatch 寫起來不複雜,但僅能看到時間單一面向,好像只要快,怪怪的。

那有無更好的選擇?

Reflection-使用反射執行方法的7種方式

Reflection-使用反射執行方法的7種方式

最近因為專案需求,努力寫著反射(Reflection)程式,還好哥早在2011年就打過底,但大型實務應用開發之後在 fb 上發表些小心得:

  • 取得物件 System.Type 後基本上就無敵了。
  • 你能做的、你不能做的,Reflection 都能做。白話:一些簡單的 private 之類限制對 Reflection 無效。
  • 製作沒有規範 Assembly 的 Reflection 解析執行程式需要:細心、耐心與草x馬的愛心。(突然覺得那些反編譯器好偉大)
  • 接上題,規範好 Assembly 介面定義,大家都會很開心
  • 寫法不同,效果不同。純反射 4.1 > dynamic 1.4 < delegate 1.2。delegate 最快。
  • Expression 網路上的資料它也比 dynamic 快,但我的實作不適合驗證,沒取得數值。
  • ps. 美國微軟工程師的 Bruce 說,dynamic 能不用就不用。我自己的實作心得:dynamic 沒有比 delegate 快,又有些缺點,我也不建議使用。

後來,實在手癢的受不了,把底層用 Expression 改寫,得到以下結果:

  • v1, reflection - 純反射,最慢;
  • v2, delegate - 比純反射快 4 倍(自己測);
  • v3, expression - 與 delegate 差不多;

速度與可讀性而言,目前 delegate 最好。寫法不同,效果不同。

Reflection - Method Invoke 7 Ways

這裡我將手邊知道的「執行方法」的方法做了以下整理,總共有 7 種方向。

Xamarin+.NET Standard之同時存在的HttpClient衝突小筆記

Xamarin+.NET Standard之同時存在的HttpClient衝突小筆記

.NET Standard - HttpClient Error Message
.NET Standard - HttpClient build error message

團隊試著使用「Xamarin + .NET Standard」的組合來試著開發跨平台應用程試,因為 .NET Standard 是比較新的 PCL(可攜式類別庫),碰到問題解決時,G大和S大能提供的解決方法也比較少,例如,如上圖,在 .NET Standard 裡呼叫 HttpClient 連編譯都有問題,這可不好玩…

來吧,製作自己或團隊的Visual Studio(多)專案範本-Xamarin.Forms為例

來吧,製作自己或團隊的Visual Studio(多)專案範本-Xamarin.Forms為例

Installed Templates

使用Visual Studio的人一定使用過新增專案,在新增專案的過程有個步驟一定省略不了,那就是選擇你所需的專案範本,Visual Studio本身準備了非常非常豐富的專案範本,但就是有不夠用的時候,這時有二種處理方式,除了Visual Studio裡已安裝(Installed)範本外,還可以搜尋線上(Online)範本,Installed 範本大約能解決 90% 的開發需求,Online 範本能在提供 5% ~ 8% 特別需求的解決方案(但也是比較通用或一般性),另外的 2% ~ 5% 就是今天想討論的主題,客製化自己或團隊的專案範本。

Online Templates

將Xamarin.Forms的Droid與iOS專案轉換使用NuGet v3和Project.json管理套件

將Xamarin Droid與iOS專案轉換使用NuGet v3和Project.json管理套件

Xamarin develop platforms

前一篇 將Xamarin的PCL專案升級轉換為.NET Standard Library 我們將 Xamarin 跨平台裡的 PCL 專案轉換為使用 .NET Standard Library,但這只完成整個 Xamarin 專案的其中一個專案,其實並未算是把整個 Xamarin 專案完全使用 .NET Standard Library 目標,目前這個當下(或許 Visual Studio 2017 會改善),還有許多工作需要人工作業,讓我們一步步來將整個專案完成轉換。