iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0

目的

快速測試不同寫法的效能差異。

同步更新於個人部落格
BenchmarkDotNet範例

1.建立新專案

選擇主控台應用程式專案範本,並執行下一步
步驟1

2.設定新的專案

命名你的專案名稱,並選擇專案要存放的位置。
步驟2

3.其他資訊

直接進行下一步

4.NuGet加入套件

下載BenchmarkDotNet套件與automapper套件,automapper為這次要測試效能的套件
步驟4-1
步驟4-2

5.Program寫入程式

此次要測試的項目為三種類別轉換的效能差異

using AutoMapper;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
//指定要測試的class
var summary = BenchmarkRunner.Run<BenchmarkSampleAuto>();
//加入記憶體使用量測試
[MemoryDiagnoser]
public class BenchmarkSampleAuto {

  private readonly List<DbModel> _data = new List<DbModel>();
  private readonly IMapper _mapper;
  public BenchmarkSampleAuto() {
    //automapper設定
    var config = new MapperConfiguration(cfg => {
      cfg.CreateMap<DbModel, ViewModel>();
    });
    _mapper = new Mapper(config);
    //準備一份List資料
    PrepareTestObjects();
  }
  private void PrepareTestObjects() {
    _data.Add(new DbModel() { Id = 1, Name = "Bill", Age = 18, CreatedDate = DateTime.Now });
    _data.Add(new DbModel() { Id = 1, Name = "CI-YU", Age = 20, CreatedDate = DateTime.Now });
    _data.Add(new DbModel() { Id = 1, Name = "Bill Huang", Age = 22, CreatedDate = DateTime.Now });
  }
  //待測方法需要加上Benchmark屬性
  [Benchmark]
  public List<ViewModel> first() {
    return _mapper.Map<List<ViewModel>>(_data);
  }
  //待測方法需要加上Benchmark屬性
  [Benchmark]
  public List<ViewModel> second() {
    var listModel = new List<ViewModel>();
    foreach (var c in _data) {
      listModel.Add(new ViewModel() { Id = c.Id, Name = c.Name, Age = c.Age });
    }
    return listModel;
  }
  //待測方法需要加上Benchmark屬性
  [Benchmark]
  public List<ViewModel> third() {
    var listModel = new List<ViewModel>();
    listModel = _data.Select(c => new ViewModel() { Id = c.Id, Name = c.Name, Age = c.Age }).ToList();
    return listModel;
  }
}

public class DbModel {
  public int Id { get; set; }
  public string? Name { get; set; }
  public int Age { get; set; }
  public DateTime CreatedDate { get; set; }
}
public class ViewModel {
  public ViewModel() {
    Name = string.Empty;
  }
  public int Id { get; set; }
  public string Name { get; set; }
  public int Age { get; set; }
}

6.執行測試

執行測試前需要將組態改為Release才可以進行測試

步驟6

7.執行結果

最後的執行結果發現第二種方法的效能是最好的,通常最主要是看mean及allocated兩個參數

  • Mean 平均時間
  • Allocated 記憶體使用量
    步驟7

補充

在專案資料夾bin\Release\net6.0\BenchmarkDotNet.Artifacts\results底下會有詳細的報告,檔案格式有csv,html,md

參考資料

參考
伊果的沒人看筆記本

範例檔

GitHub


上一篇
[.net 6] Automapper範例
下一篇
[.net 6] Autofac範例
系列文
.net6套件入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言