目的

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

建立新專案

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

設定新的專案

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

其他資訊

直接進行下一步

NuGet加入套件

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

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; }
}

執行測試

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

步驟6

執行結果

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

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

補充

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

參考資料

參考 伊果的沒人看筆記本

範例檔

GitHub